Recuperando commits perdidos com git reflog
Tem um tipo especĂfico de pĂąnico que bate quando parece que um commit simplesmente sumiu. Talvez vocĂȘ tenha rodado um hard reset, ou um rebase deu errado, e o trabalho que estava aĂ um minuto atrĂĄs nĂŁo aparece em lugar nenhum do seu histĂłrico. Antes de assumir que ele foi embora para sempre, tem um comando que pode te ajudar a trazer isso de volta: git reflog.
O que Ă© o reflog?
O Git mantĂ©m um registro privado de todos os lugares por onde o HEAD passou. Tudo o que vocĂȘ faz no Git que move o ponteiro HEAD fica registrado, seja porque vocĂȘ fez um commit, deu um checkout, rodou um reset, ou porque um rebase ou merge mexeu nele.
Esse registro de movimento fica no log de referĂȘncia (do inglĂȘs reference log ou reflog, para encurtar) e ele Ă© local na sua mĂĄquina. EntĂŁo, mesmo quando um commit nĂŁo aparece mais no git log, a referĂȘncia para ele geralmente ainda estĂĄ no reflog.
Encontrando o commit que vocĂȘ perdeu
Para ver o reference log, vocĂȘ pode rodar o comando abaixo:
git reflog
VocĂȘ vai ver uma lista de movimentos recentes, com a entrada mais recente no topo, como na imagem abaixo.

Cada linha tem um hash curto, uma referĂȘncia como HEAD@{2}, e uma descrição do que aconteceu, coisas como âcommitâ, âreset: moving toâ ou âcheckoutâ.
Mesmo que seja difĂcil se acostumar a ler esse novo formato de log, a descrição e a ordem geralmente deixam claro onde vocĂȘ estava e podem ser a indicação que vocĂȘ precisa para saber para onde quer voltar.
Voltando para lĂĄ
Quando vocĂȘ encontrar a entrada certa, copie o hash. Depois, mova o seu branch de volta para aquele ponto:
git reset --hard <hash>
Substitua <hash> pelo hash que vocĂȘ encontrou no reflog.
Por exemplo, pensando na imagem acima, se vocĂȘ quiser voltar para o estado antes do reset, vocĂȘ precisaria rodar o seguinte:
git reset --hard a68cffa
Depois disso, o seu estado de trabalho volta a bater com o momento antes do erro, como se nada tivesse acontecido.
Uma observação rĂĄpida: git reset --hard descarta as suas mudanças nĂŁo commitadas. EntĂŁo tenha certeza de que vocĂȘ realmente quer cair nesse estado anterior antes de rodar o comando. Se vocĂȘ nĂŁo tiver certeza, vocĂȘ pode usar git switch para ir atĂ© o hash primeiro e dar uma olhada sem mover o seu branch.
Recapitulando
A maioria das pessoas aprende sobre o reflog do jeito difĂcil, depois de perder trabalho por causa de um reset ou de um rebase. EntĂŁo saber que ele existe pode ser uma mĂŁo na roda numa emergĂȘncia.
Recapitulando os passos para restaurar um estado anterior perdido com o reflog:
- Encontre o estado para o qual vocĂȘ quer voltar e copie o hash.
- Confira se esse Ă© mesmo o estado que vocĂȘ quer restaurar com
git switch <hash>. Se não for, repita os passos 1 e 2 até encontrar o estado certo. - Rode
git reset --hard <hash>para voltar para ele.
O reflog combina bem com os outros comandos que movem o HEAD: desfazendo o Ășltimo commit e reaproveitando a mensagem, atualizando um branch com git rebase, e usando git stash. Se algum deles te fizer perder trabalho, o reflog Ă© a sua rede de segurança.
