Como reverter um “git rm -r.”

Eu acidentalmente disse git rm -r . . Como eu me recupero disso?

Eu não cometi.

Eu acho que todos os arquivos foram marcados para exclusão e também foram removidos fisicamente do meu checkout local.

EDIT: eu poderia (se eu sabia o comando) reverter para o último commit. Mas seria muito melhor se eu pudesse desfazer o git rm -r . . Porque eu não tenho certeza do que fiz depois do último commit e antes do git rm -r . .

 git reset HEAD 

Deve fazer isso. Se você não tem alterações não comprometidas com as quais se importa,

 git reset --hard HEAD 

deve forçar a redefinir tudo para o seu último commit. Se você tiver alterações não confirmadas, mas o primeiro comando não funcionar, salve suas alterações não confirmadas com git stash :

 git stash git reset --hard HEAD git stash pop 

Eu gravei alguns arquivos e continuei fazendo alterações antes do meu próximo commit quando percebi que precisava de alguns desses arquivos de volta. Em vez de armazenar e redefinir, você pode simplesmente fazer o checkout dos arquivos individuais perdidos / removidos, se desejar:

 git checkout HEAD path/to/file path/to/another_file 

Isso deixa suas outras alterações não confirmadas intactas sem soluções alternativas.

Para recuperar alguns arquivos ou pastas, pode-se usar o seguinte

 git reset -- path/to/file git checkout -- path/to/file 

Isso primeiro recriará as inputs de índice para path/to/file e recriará o arquivo como estava no último commit, isto é, HEAD .

Dica: pode-se passar um hash de commit para ambos os comandos para recriar arquivos de um commit antigo. Veja git reset --help e git checkout --help para detalhes.

Atualizar:

Desde git rm . exclui todos os arquivos neste e nos diretórios filhos na verificação de funcionamento, bem como no índice, você precisa desfazer cada uma dessas alterações:

 git reset HEAD . # This undoes the index changes git checkout . # This checks out files in this and child directories from the HEAD 

Isso deve fazer o que você quiser. Isso não afeta as pastas pai do código ou índice de check-out.


Resposta antiga que não foi:

 reset HEAD 

vai fazer o truque, e não irá apagar todas as alterações não confirmadas que você fez em seus arquivos.

Depois disso, você precisa repetir qualquer comando git add você tenha enfileirado.

Se você acabar com nenhum dos trabalhos acima, você poderá recuperar dados usando a sugestão aqui: http://www.spinics.net/lists/git/msg62499.html

 git prune -n git cat-file -p  

Se você tiver confirmado e pressionado as alterações, poderá fazer isso para recuperar o arquivo

 // Replace 2 with the # of commits back before the file was deleted. git checkout HEAD~2 path/to/file 

Já existem algumas boas respostas, mas posso sugerir uma syntax pouco usada que não só funciona muito bem, mas é muito explícita no que você quer (não é assustador nem misterioso)

 git checkout @{"20 minutes ago"}  

Obter lista de confirmação

 git log --oneline 

Por exemplo, Stable commit tem hash: 45ff319c360cd7bd5442c0fbbe14202d20ccdf81

 git reset --hard 45ff319c360cd7bd5442c0fbbe14202d20ccdf81 git push -ff origin master 

desfazer gm rm

 git rm file # delete file & update index git checkout HEAD file # restore file & index from HEAD 

desfazer gm rm -r

 git rm -r dir # delete tracked files in dir & update index git checkout HEAD dir # restore file & index from HEAD 

desfazer git rm -rf

 git rm -r dir # delete tracked files & delete uncommitted changes not possible # `uncommitted changes` can not be restored. 

Uncommitted changes staged changes but not committed incluem Uncommitted changes not staged changes , staged changes but not committed .

Eu tive uma situação idêntica. No meu caso, a solução foi:

 git checkout -- . 

Eu tive exatamente o mesmo problema: estava limpando minhas pastas, reorganizando e movendo arquivos. Eu entrei: git rm . e aperte enter; e então senti minhas entranhas soltarem um pouco. Por sorte, eu não digitei git commit -m “” imediatamente.

No entanto, o seguinte comando

 git checkout . 

restaurou tudo e salvou minha vida.