Executando verificação de segurança...
4

[git] feat: git show e git checkout desbloqueados!

Hoje no trabalho precisei rodar um script que configura automaticamente a conexão com o banco de dados e com a SSH, porém, ao tentar executar eles pelo terminal percebi que eles simplesmente não existiam mais.

Durante a madrugada o CTO refatorou o projeto e decidiu remover esses arquivos para limpar o projeto. Então tive que ir atrás deles em commits passados, só que nunca havia passado por isso antes.

Então perguntei pro GPT como faria isso e ele me apresentou dois comandos maneiríssimos:

git show

Este serve para mostrar os arquivos / pastas no terminal. Usei ele inicialmente para procurar pelos arquivos nos outros commits e descobrir em que commit do repo ainda tinha os arquivos que eu precisava.

Funciona da seguinte forma, ele recebe dois parâmetros: o hash(SHA) correspondente ao seu commit e o caminho da pasta ou arquivo que você quer olhar.

Exemplo:

git show sha:app/

Retorno:

Controllers/
Models/
Views/
Utils/

Este código é gerado toda vez que você faz um commit, olhando na lista de commits pelo Github você consegue copiar ele.

git checkout

Agora que já sabemos em que commit olhar para puxar nossos arquivos, podemos usar o git checkout. Ele serve para puxar o arquivo do commit passado para a pasta atual, importante notar que ele apenas puxa o arquivo, não troca de branch.

Exemplo:

git checkout sha -- app/

E boa! problema resolvido.

Carregando publicação patrocinada...
2

Só pra complementar, na verdade git show faz um pouco mais do que apenas mostrar pastas e arquivos. De acordo com a documentação, ele serve para "mostrar vários tipos de objetos". Então o objeto pode ser um commit, uma tag, um arquivo, e cada um pode ser mostrado em um formato diferente.

O formato sha:path é apenas um dos muitos existentes, que no caso resultará em um arquivo ou diretório correspondente ao path, no estado em que estava no commit em questão. Se for um arquivo ou diretório, vai mostrar o conteúdo deste. Se for apenas um commit, ou qualquer coisa que resulte em um commit específico (como git show HEAD~3 para mostrar 3 commits antes do atual, ou git show algumbranch para mostrar o commit para o qual o branch aponta, etc), ele mostrará um resumo do commit (data, autor, mensagem, etc, e um diff das alterações).


Mas o problema é que primeiro você precisa descobrir em qual commit o arquivo/diretório foi apagado. Claro que vc pode pegar a lista de commits e ir olhando um a um, mas tem um jeito mais fácil de fazer isso com o próprio git log:

$ git log --all --name-status --oneline  -- arq.txt

Neste exemplo ele busca todos os commits no qual o arquivo arq.txt foi modificado de alguma maneira (mas vc também poderia usar o nome de um diretório). A saída será algo do tipo:

6862011 Apagar arq.txt
D       arq.txt
e9b6312 Modificar arq.txt
M       arq.txt
17d52c1 Criar arq.txt
A       arq.txt

A indica quando o arquivo foi adicionado (acima seria no commit 17d52c1 - lembrando que a saída mostra os hashes abreviados), M é quando ele foi modificado (commit e9b6312) e D é quando ele foi deletado (commit 6862011).


Por fim, vale lembrar que desde 2019 existe o comando restore, como alternativa ao checkout. No caso, o equivalente para trazer de volta a pasta seria:

git restore -s sha1_commit --staged  -- pasta_ou_arquivo