Então, você fez um git reset --hard HEAD^
e jogou fora o seu último commit. Bem, acontece que você realmente precisa dessas mudanças. Você nunca será capaz de implementar esse algoritmo perfeitamente, de modo que você obtenha o que precisa de volta. Não tema, pois o GIT ainda deve ter o seu commit. Quando você faz um reset, o commit que você jogou fora passou para um estado de “pendente”. Ele ainda esta no datastore do GIT, aguardando que a próxima execução do ‘garbage collection’ limpe tudo. Portanto, caso você não tenha executado um git gc
, você ainda poderá restaurá-lo.
Por exemplo, eu estou trabalhando com o código deste blog. Para executarmos os seguintes códigos:
$ git show-ref -h HEAD 7c61179cbe51c050c5520b4399f7b14eec943754 HEAD $ git reset --hard HEAD^ HEAD is now at 39ba87b Fixing about and submit pages so they don't look stupid $ git show-ref -h HEAD 39ba87bf28b5bb223feffafb59638f6f46908cac HEAD
Então o nosso HEAD
foi apoiado por um commit. Neste ponto se você quiser voltar pode apenas fazer um git pull
, mas não estamos partindo do princípio de que só o nosso repositório local sabe sobre o commit. Temos o SHA1 do commit para que possamos trazê-lo de volta. Podemos provar o que o GIT ainda sabe sobre commit com o comando fsck
:
$ git fsck --lost-found [... some blobs omitted ...] dangling commit 7c61179cbe51c050c5520b4399f7b14eec943754
Você também pode ver o que o GIT ainda sabe sobre o commit utilizando o comando reflog
:
$ git reflog 39ba87b... HEAD@{0}: HEAD~1: updating HEAD 7c61179... HEAD@{1}: pull origin master: Fast forward [... lots of other refs ...]
Então, agora temos o nosso SHA1: 7c61179
. Se quisermos obte-lo novamente e aplicá-lo de volta ao nosso branch atual, então devemos fazer um git merge
para recuperar o commit:
$ git merge 7c61179 Updating 39ba87b..7c61179 Fast forward css/screen.css | 4 ++++ submit.html | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-)
Este comando irá trazer as suas alterações perdidas de volta e se certificar de que o HEAD
esta apontando para o commit. A partir daqui você pode continuar trabalhando normalmente! Você também pode validar o SHA1 de um novo branch, mas realmente um merge
é a maneira mais facíl e rápida para restaurar um commit perdido desde que você tenha o hash. Se você souber algum outro caminho nos informe nos comentários!
Se você quiser mais opções sobre o que fazer nessa situação, Mathieu Martin’s fez um guia ilustrado para recuperar commits perdidos no GIT.