As respostas aqui são mais úteis para mim do que as respostas nas duplicatas .
Felipe Alvarez
5
concordou ... independentemente das duplicatas ... elas não apareceram na pesquisa do Google .... esta apareceu ... espero que paremos de perder tempo perseguindo duplicatas ... apenas o tempo e o algoritmo do Google diga qual é a melhor pergunta.
Tim Boland
Respostas:
1601
Se você não souber o caminho exato, poderá usar
git log --all --full-history -- "**/thefile.*"
Se você souber o caminho que o arquivo estava, você pode fazer o seguinte:
git log --all --full-history -- <path-to-file>
Isso deve mostrar uma lista de confirmações em todas as ramificações que tocaram nesse arquivo. Em seguida, você pode encontrar a versão do arquivo que deseja e exibi-la com ...
git show <SHA> -- <path-to-file>
Ou restaure-o na sua cópia de trabalho com:
git checkout <SHA>^ -- <path-to-file>
Observe o símbolo de sinal de intercalação ( ^), que recebe a finalização da compra antes da identificação, porque no momento da <SHA>confirmação do arquivo é excluído, precisamos observar a confirmação anterior para obter o conteúdo do arquivo excluído
Tente usar um caminho relativo em vez de absoluto (se você ainda não estiver).
26611 Amber
63
E se você não souber o caminho exato? Tudo o que você sabe é o nome do arquivo?
priestc
17
O @PedroMorteRolo git log -- <path>não terá saída quando você estiver em uma ramificação na qual o arquivo nunca existiu. Você deve sempre usar git log --all -- <path>, para garantir que não perca as alterações que ocorreram em outros ramos. O comando git log -- <path>pode ser muito perigoso se você tiver mais de um ramo e tender a esquecer caminhos e ramos (como eu) e também será perigoso se você trabalhar com outros desenvolvedores.
hobs
4
@ Amber, considere adicionar --all(obrigado Philip ) à sua git logresposta, para que as pessoas não percam alterações e arquivos em outros ramos. Isso pouparia muita gente esquecida como eu.
HOBs
3
Como indicado na resposta abaixo, a restauração do arquivo deve ser git checkout <SHA>^ -- <path-to-file>(observe o símbolo ^), porque no momento do <SHA> commit o arquivo é excluído, precisamos observar o commit anterior para obter o conteúdo do arquivo excluído
kipelovets
393
Obtenha uma lista dos arquivos excluídos e copie o caminho completo do arquivo excluído
git log --diff-filter=D --summary | grep delete
Execute o próximo comando para encontrar o ID de confirmação dessa confirmação e copie o ID de confirmação
git log --all -- FILEPATH
Mostrar diff do arquivo excluído
git show COMMIT_ID -- FILE_PATH
Lembre-se, você pode gravar a saída em um arquivo usando >como
Embora eu encontrei o caminho com a ajuda da primeira etapa, o segundo passo lança este erro: unknown revision or path not in the working tree.
jvannistelrooy
6
Para ver o hashes comprometer, juntamente com as exclusões, você pode fazergit log --diff-filter=D --summary | grep -E 'delete|^commit\s+\S+'
Chris Middleton
1
O passo 2 não retorna nada. Alguma idéia de por que isso pode acontecer? Meu nome de arquivo está correto.
Denis Kniazhev
2
Para encontrar a combinação das três em uma função, adicione-a no seu .bashrc ou .zshrc: git-grep-latest(){ result_path=$(git log --diff-filter=D --summary | grep $1 | head -1 | awk '{print $4;}'); latest_commit=$(git log --all -- $result_path | head -1 | awk '{print $2;}'); git show $latest_commit -- $result_path; }e agora você pode fazer o seguinte:git-grep-latest some_text
randomor
1
@ TylerJones, você pode alimentar qualquer coisa com o Linux usando pipes - google linux pipes.. você vai gostar.
John Hunt
37
Não foi possível editar a resposta aceita, portanto, adicione-a como resposta aqui,
para restaurar o arquivo no git, use o seguinte (observe o sinal '^' logo após o SHA)
Eu não entendo por que você iria querer o ^. O arquivo está no commit com esse SHA ... por que você deseja retornar outro commit a partir daí?
Tony K.
19
Está no commit com esse sha como "deletado", o que significa que ele ainda não existirá. Você precisa ir ao commit antes disso para recuperá-lo.
precisa saber é o seguinte
6
@tandrewnichols, o que significa que você está usando o SHA de confirmação errado - você deseja o commit para a versão do arquivo que deseja ... o que provavelmente não é a versão em que o arquivo é excluído.
Âmbar
6
@ Amber e o commit que você deseja provavelmente é o mais recente antes de ser excluído, portanto, esta resposta.
Sam Titular
1
@AlexR: <SHA>~1deve funcionar da mesma forma sem a necessidade de envolvê-lo com aspas.
CodeManX 15/06
37
Suponha que você queira recuperar um arquivo chamado MyFile, mas não tenha certeza de seu caminho (ou extensão):
Prelim .: Evite confusão, pisando na raiz do git
Um projeto não trivial pode ter vários diretórios com nomes semelhantes ou idênticos.
para console do Windows (cmd), use find em vez de grep na etapa 2: git log --diff-filter=D --summary | find "delete" | find "MyFile"e na step3, observe as aspas ao redor do hash:git checkout "bd8374c^" -- full/path/to/MyFile.js
user5542121
30
@ Amber deu a resposta correta! Apenas mais uma adição, se você não souber o caminho exato do arquivo, poderá usar curingas! Isso funcionou para mim.
@PedroMorteRolo Hmm. Não sei como me sinto ao copiar uma resposta existente para a mais votada: / Essa resposta também foi útil por si só; um voto positivo pode ter sido suficiente?
Clément
1
Isso não encontra o arquivo se ele estiver na raiz do projeto (testado no Cygwin).
Wortwart #
19
Abaixo está um comando simples, no qual um usuário dev ou git pode passar um nome de arquivo excluído do diretório raiz do repositório e obter o histórico:
Incrível, obrigado! Looks como meu arquivo nunca existiu em tudo, mas isso é uma questão mais peludo separado e muito mais ...
certifique-se de executar este a partir do diretório raiz do repositório se o arquivo parece ser 'desaparecidos'
samaspin
Obrigado @samaspin atualizou a resposta.
18719 Jason
18
Tente usar um dos visualizadores, como gitkpara que você possa navegar pelo histórico para encontrar o arquivo meio lembrado. (use gitk --allse necessário para todos os ramos)
Respostas:
Se você não souber o caminho exato, poderá usar
Se você souber o caminho que o arquivo estava, você pode fazer o seguinte:
Isso deve mostrar uma lista de confirmações em todas as ramificações que tocaram nesse arquivo. Em seguida, você pode encontrar a versão do arquivo que deseja e exibi-la com ...
Ou restaure-o na sua cópia de trabalho com:
git checkout <SHA>^ -- <path-to-file>
Observe o símbolo de sinal de intercalação (
^
), que recebe a finalização da compra antes da identificação, porque no momento da<SHA>
confirmação do arquivo é excluído, precisamos observar a confirmação anterior para obter o conteúdo do arquivo excluídofonte
git log -- <path>
não terá saída quando você estiver em uma ramificação na qual o arquivo nunca existiu. Você deve sempre usargit log --all -- <path>
, para garantir que não perca as alterações que ocorreram em outros ramos. O comandogit log -- <path>
pode ser muito perigoso se você tiver mais de um ramo e tender a esquecer caminhos e ramos (como eu) e também será perigoso se você trabalhar com outros desenvolvedores.--all
(obrigado Philip ) à suagit log
resposta, para que as pessoas não percam alterações e arquivos em outros ramos. Isso pouparia muita gente esquecida como eu.git checkout <SHA>^ -- <path-to-file>
(observe o símbolo ^), porque no momento do <SHA> commit o arquivo é excluído, precisamos observar o commit anterior para obter o conteúdo do arquivo excluídoObtenha uma lista dos arquivos excluídos e copie o caminho completo do arquivo excluído
Execute o próximo comando para encontrar o ID de confirmação dessa confirmação e copie o ID de confirmação
Mostrar diff do arquivo excluído
Lembre-se, você pode gravar a saída em um arquivo usando
>
comofonte
unknown revision or path not in the working tree
.git log --diff-filter=D --summary | grep -E 'delete|^commit\s+\S+'
git-grep-latest(){ result_path=$(git log --diff-filter=D --summary | grep $1 | head -1 | awk '{print $4;}'); latest_commit=$(git log --all -- $result_path | head -1 | awk '{print $2;}'); git show $latest_commit -- $result_path; }
e agora você pode fazer o seguinte:git-grep-latest some_text
linux pipes
.. você vai gostar.Não foi possível editar a resposta aceita, portanto, adicione-a como resposta aqui,
para restaurar o arquivo no git, use o seguinte (observe o sinal '^' logo após o SHA)
fonte
<SHA>~1
deve funcionar da mesma forma sem a necessidade de envolvê-lo com aspas.Suponha que você queira recuperar um arquivo chamado
MyFile
, mas não tenha certeza de seu caminho (ou extensão):Prelim .: Evite confusão, pisando na raiz do git
Um projeto não trivial pode ter vários diretórios com nomes semelhantes ou idênticos.
Encontre o caminho completo
delete mode 100644 full/path/to/MyFile.js
full/path/to/MyFile.js
é o caminho e o arquivo que você está procurando.Determine todas as confirmações que afetaram esse arquivo
bd8374c Some helpful commit message
ba8d20e Another prior commit message affecting that file
cfea812 The first message for a commit in which that file appeared.
Finalize o arquivo
Se você escolher o primeiro commit listado (o último cronologicamente, aqui bd8374c), o arquivo não será encontrado, pois foi excluído nesse commit.
Basta selecionar o commit anterior (acrescentar um sinal de intercalação):
fonte
git log --diff-filter=D --summary | find "delete" | find "MyFile"
e na step3, observe as aspas ao redor do hash:git checkout "bd8374c^" -- full/path/to/MyFile.js
@ Amber deu a resposta correta! Apenas mais uma adição, se você não souber o caminho exato do arquivo, poderá usar curingas! Isso funcionou para mim.
fonte
Abaixo está um comando simples, no qual um usuário dev ou git pode passar um nome de arquivo excluído do diretório raiz do repositório e obter o histórico:
Se alguém puder melhorar o comando, faça.
fonte
Tente usar um dos visualizadores, como
gitk
para que você possa navegar pelo histórico para encontrar o arquivo meio lembrado. (usegitk --all
se necessário para todos os ramos)fonte
--all
opção é crítica para sua resposta e a resposta aceita.Resumo:
Você pesquisa o caminho completo do arquivo no histórico de arquivos excluídos
git log --diff-filter=D --summary | grep filename
Você restaura seu arquivo da confirmação antes de ser excluído
fonte
Aqui está a minha solução:
fonte