Desfazer um commit é um pouco assustador se você não sabe como ele funciona. Mas é realmente incrivelmente fácil se você entender.
Digamos que você tenha isso, onde C é sua CABEÇA e (F) é o estado de seus arquivos.
(F)
A-B-C
↑
master
Você deseja remover o commit do C e nunca mais vê-lo e perder todas as alterações nos arquivos modificados localmente . Você faz isso:
git reset --hard HEAD~1
O resultado é:
(F)
A-B
↑
master
Agora B é a CABEÇA. Como você usou --hard
, seus arquivos são redefinidos para seus estados na confirmação B.
Ah, mas suponha que o commit C não tenha sido um desastre, mas apenas um pouco. Você deseja desfazer o commit, mas mantenha suas alterações um pouco para editar antes de fazer um commit melhor. Começando novamente a partir daqui, com C como sua CABEÇA:
(F)
A-B-C
↑
master
Você pode fazer isso, deixando de fora o --hard
:
git reset HEAD~1
Nesse caso, o resultado é:
(F)
A-B-C
↑
master
Nos dois casos, HEAD é apenas um ponteiro para o último commit. Quando você faz um git reset HEAD~1
, você diz ao Git para mover o ponteiro HEAD de volta para um commit. Mas (a menos que você use --hard
), você deixa seus arquivos como estavam. Então agoragit status
, mostra as alterações que você registrou no C. Você não perdeu nada!
Para dar um toque mais leve, você pode até desfazer seu commit, mas deixar seus arquivos e seu índice :
git reset --soft HEAD~1
Isso não apenas deixa seus arquivos em paz, mas também deixa seu índice em paz. Ao fazê-lo git status
, você verá que os mesmos arquivos estão no índice de antes. De fato, logo após esse comando, você poderia fazer git commit
e refazer o mesmo commit que acabou de ter.
Mais uma coisa: suponha que você destrua um commit como no primeiro exemplo, mas depois descubra que precisava dele afinal ? Muita sorte, certo?
Não, ainda há uma maneira de recuperá-lo. Digite git reflog
e você verá uma lista de commit (parcial) shas (ou seja, hashes) nos quais você se mudou. Encontre o commit que você destruiu e faça o seguinte:
git checkout -b someNewBranchName shaYouDestroyed
Agora você ressuscitou esse commit. As confirmações não são realmente destruídas no Git por cerca de 90 dias; portanto, você pode voltar e resgatar uma que você não queria se livrar.