Visualizando um arquivo deletado no Git

105

Eu apaguei um arquivo com o Git e depois efetuei o commit, então o arquivo não está mais na minha cópia de trabalho. Desejo examinar o conteúdo desse arquivo, mas não realmente restaurá-lo. Como posso fazer isso?

Colin Ramsay
fonte

Respostas:

145
git show HEAD^:path/to/file

Você pode usar um identificador de commit explícito ou HEAD~npara ver versões mais antigas ou se houve mais de um commit desde que você o excluiu.

CB Bailey
fonte
6
Observe que path/to/fileé o caminho completo do início do projeto (diretório superior do repositório).
Jakub Narębski
1
Eu tenho fatal: Invalid object name 'HEAD^'.(devo mencionar que tenho apenas "commit inicial")
vladkras
1
Se a exclusão for testada, mas não confirmada, use HEAD em vez de HEAD ^ (já que existia em HEAD). Por exemplo, achei que precisava do arquivo, então o adicionei e me comprometi a salvar meu trabalho, depois o excluí quando encontrei uma solução diferente. Para ver o arquivo original antes de confirmar novamente, fiz git show HEAD: caminho / para / arquivo
Tony Wickham
1
Acho que também vale a pena mencionar que isso só funciona se o arquivo foi excluído no commit mais recente. Se o arquivo foi excluído vários commits atrás, você precisará usar uma das outras respostas.
Jayhendren
50

Se este for um arquivo que você excluiu há um tempo e não deseja buscar uma revisão , você pode usar (o arquivo é nomeado fooneste exemplo; você pode usar um caminho completo):

git show $(git rev-list --max-count=1 --all -- foo)^:foo

A rev-listinvocação procura todas as revisões de, foomas lista apenas uma. Visto que rev-listlista em ordem cronológica reversa, então o que lista é a última revisão que mudou foo, que seria o commit que foi excluído foo. (Isso é baseado na suposição de que git não permite que um arquivo excluído seja alterado e ainda assim permaneça excluído.) Você não pode apenas usar a revisão que rev-listretorna como está porque foonão existe mais lá. Você deve solicitar aquele imediatamente anterior que contém a última revisão do arquivo, portanto, o ^in git show.

Louis
fonte
2
Pode ser necessário alterar o último foo para ./foo. E para eles que não usam o bash, obtenha o id com "git rev-list --max-count = 1 --all - foo" e faça "git show 5824127a8d99576632a04ac2b5c2344bcf751967: ./ foo" com o id (524 .. é a id)
Dror
1
Boa resposta. Tive que usar ~ em vez de ^. Não sei por quê. E para que as pessoas saibam, 'foo' aqui deve ser um caminho completo da raiz git.
pedorro
Você pode escrever **/foose não souber o caminho (isso funcionará para o comando rev-list, mas não para o comando show. No entanto, com o commit do comando rev-list você pode então encontrar o caminho).
Nickolai
10

Já que você pode não se lembrar do caminho exato, você pode obter o sha1 do git log e então simplesmente emitir

 git cat-file -p <sha1>
Pdeschen
fonte
5
Em nome de Samuel Slund : Uma maneira de encontrar a soma sha1 a ser usada acima é: git whatchanged --no-abbrevisso fornece uma saída semelhante a git (ou svn) log.
ruído natural