remover Encontre e restaure um arquivo excluído em um repositório Git




remover commit git (16)

Simples e preciso

Primeiro de tudo, pegue um último commit estável no qual você tem aquele arquivo -

git log 

Digamos que você encontre $ commitid 1234567 ..., então

git checkout <$commitid> $fileName

Isso irá restaurar a versão do arquivo que estava naquele commit.

Digamos que eu esteja em um repositório Git. Eu excluo um arquivo e confirmo essa alteração. Eu continuo trabalhando e faço mais alguns commits. Então, eu acho que preciso restaurar esse arquivo.

Eu sei que posso fazer o checkout de um arquivo usando o git checkout HEAD^ foo.bar , mas eu realmente não sei quando esse arquivo foi deletado.

  1. Qual seria a maneira mais rápida de encontrar o commit que deletou um determinado nome de arquivo?
  2. Qual seria a maneira mais fácil de recuperar esse arquivo na minha cópia de trabalho?

Eu estou esperando que eu não tenho que procurar manualmente meus logs, checkout todo o projeto para um determinado SHA e, em seguida, copiar manualmente esse arquivo em meu checkout do projeto original.


Eu tenho essa solução .

  1. Obtenha o id do commit no qual o arquivo foi excluído usando uma das formas abaixo.

    • git log --grep=*word*
    • git log -Sword
    • git log | grep --context=5 *word*
    • git log --stat | grep --context=5 *word* git log --stat | grep --context=5 *word* # recomendado se você não lembra de nada
  2. Você deve obter algo como:

commit bfe68bd117e1091c96d2976c99b3bcc8310bebe7 Autor: Alexander Orlov Data: qui 12 de maio 23:44:27 2011 +0200

replaced deprecated GWT class
- gwtI18nKeySync.sh, an outdated (?, replaced by a Maven goal) I18n generation script

commit 3ea4e3af253ac6fd1691ff6bb89c964f54802302 Autor: Alexander Orlov Data: qui 12 de maio 22:10:22 2011 +0200

3 Agora, usando o ID de compromisso bfe68bd117e1091c96d2976c99b3bcc8310bebe7 faça:

git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

Como o commit id faz referência ao commit onde o arquivo já foi deletado, você precisa referenciar o commit antes do bfe68b, o que você pode fazer adicionando ^1 . Isso significa: me dê o commit antes de bfe68b.


Se você fez apenas alterações e excluiu um arquivo, mas não o confirmou, e agora você terminou com suas alterações

git checkout -- .

mas seus arquivos apagados não retornaram, você simplesmente faz o seguinte comando:

git checkout <file_path>

E pronto, o seu arquivo está de volta.


$ git log --diff-filter=D --summary  | grep "delete" | sort

git checkout /path/to/deleted.file

  1. Use git log --diff-filter=D --summary para obter todos os commits que git log --diff-filter=D --summary arquivos e apagaram os arquivos;
  2. Use git checkout $commit~1 filename para restaurar o arquivo deletado.

Onde $commit é o valor da confirmação que você encontrou na etapa 1, por exemplo, e4cf499627


Então eu tive que restaurar um monte de arquivos deletados de um commit específico e consegui com dois comandos:

git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git checkout <rev>^ -- 
git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git reset HEAD 

(Observe o espaço à direita no final de cada comando)

Os arquivos foram adicionados ao arquivo .gitignore e, em seguida, limpos com o git rm, eu precisava restaurar os arquivos, mas depois os desassociei. Eu tinha centenas de arquivos para restaurar, digitando coisas manualmente para cada arquivo, como nos outros exemplos, seria muito lento.


Se você sabe o commit que deletou o (s) arquivo (s), execute este comando onde <SHA1_deletion> é o commit que deletou o arquivo:

git diff --diff-filter=D --name-only <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~1 --

A parte antes do pipe lista todos os arquivos que foram excluídos no commit; eles são todos checkout do commit anterior para restaurá-los.



No nosso caso, nós acidentalmente apagamos os arquivos em um commit e alguns commits depois percebemos nosso erro e queríamos recuperar todos os arquivos que foram deletados, mas não aqueles que foram modificados.

Baseado na excelente resposta de Charles Bailey, aqui está o meu único forro:

git co $(git rev-list -n 1 HEAD -- <file_path>)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- <file_path>)~1 head | grep '^D' | cut -f 2)

Para restaurar todos os arquivos excluídos em uma pasta, digite o seguinte comando.

git ls-files -d | xargs git checkout --

Para restaurar um arquivo excluído e confirmado:

git reset HEAD some/path
git checkout -- some/path

Foi testado no Git versão 1.7.5.4.


Encontre o último commit que afetou o caminho dado. Como o arquivo não está na submissão HEAD, este commit deve ter sido deletado.

git rev-list -n 1 HEAD -- <file_path>

Em seguida, verifique a versão no commit antes, usando o símbolo de circunflexo ( ^ ):

git checkout <deleting_commit>^ -- <file_path>

Ou em um comando, se $file for o arquivo em questão.

git checkout $(git rev-list -n 1 HEAD -- "$file")^ -- "$file"

Se você estiver usando zsh e tiver a opção EXTENDED_GLOB ativada, o símbolo de cursor não funcionará. Você pode usar ~1 vez disso.

git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"

Eu tive a mesma pergunta. Sem saber, eu havia criado um commit pendente .

Listar compromissos pendentes

git fsck --lost-found

Inspecione cada comutação pendente

git reset --hard <commit id>

Meus arquivos reapareceram quando me mudei para o commit pendente.

git status pelo motivo:

“HEAD detached from <commit id where it detached>”


Em muitos casos, pode ser útil usar coreutils (grep, sed, etc.) em conjunto com o Git. Eu já conheço essas ferramentas muito bem, mas Git menos. Se eu quisesse fazer uma pesquisa por um arquivo excluído, faria o seguinte:

git log --raw | grep -B 30 $'D\t.*deleted_file.c'

Quando eu encontrar a revisão / commit:

git checkout <rev>^ -- path/to/refound/deleted_file.c

Assim como outros afirmaram antes de mim.

O arquivo agora será restaurado para o estado anterior à remoção. Lembre-se de voltar a enviá-lo para a árvore de trabalho, se você quiser mantê-lo por perto.


Se você conhece o nome do arquivo, esta é uma maneira fácil com comandos básicos:

Lista todas as confirmações para esse arquivo.

git log -- path/to/file

O último commit (mais alto) é o que deletou o arquivo. Então você precisa restaurar o segundo para o último commit.

git checkout {second to last commit} -- path/to/file




git-checkout