git reflog
Mostra por onde HEAD e os branches passaram
O comando 'git reflog' lista cada posição que HEAD já teve: cada commit, troca de branch, reset, merge e rebase, do mais recente ao mais antigo. Ele é local ao seu repositório e é a rede de segurança do trabalho perdido — commits removidos de um branch por um reset ou rebase continuam listados e podem ser recuperados com HEAD@{n}. Por padrão, as entradas expiram após 90 dias.
Sinopse
git reflog [show] [<log-options>] [<ref>]Opções
Escolhendo a opção certa
log versus reflog
Dois históricos
| Comando | Lista | Compartilhado? |
|---|---|---|
git log | Commits alcançáveis a partir de um branch | Sim, junto com os commits |
git reflog | Cada movimento do HEAD, mesmo para commits que nenhum branch tem | Não, só local |
Exemplos
Listar os movimentos do HEAD
git reflogDo mais recente ao mais antigo, com nomes HEAD@{n}.
Desfazer um reset
git reset --hard HEAD@{1}Volta para onde HEAD estava um movimento atrás.
Reflog de um branch
git reflog show mainSó os movimentos de main.
Exemplos de fluxos de trabalho
git reflogEncontrar a entrada anterior ao reset
git reset --hard HEAD@{1}Voltar para ela
git reflogEncontrar o último commit desse branch
git switch -c feature/login a1b2c3dRecriar o branch ali
Solução de problemas
O commit não está no reflog
Causa: Ele nunca foi usado aqui, ou a entrada expirou
Tente git fsck --lost-found para commits órfãos
HEAD@{1} aponta para um lugar inesperado
Causa: Cada troca de branch também conta como movimento
Leia o reflog e escolha a entrada exata
Dicas e armadilhas
Boas práticas
- ✓Consulte git reflog antes de entrar em pânico por commits perdidos.
- ✓Recupere primeiro num branch novo (git switch -c rescue <hash>) para examinar com segurança.
Erros comuns
- ✗Achar que um reset --hard apagou commits de vez — o reflog ainda os tem.
- ✗Esperar demais: commits inalcançáveis somem quando as entradas do reflog expiram e o git gc roda.
- ✗Esperar o reflog em outra máquina — ele nunca é enviado nem clonado.
Perguntas frequentes
Por padrão, 90 dias para as alcançáveis e 30 dias para as inalcançáveis.
Não, ele só lista. Quem remove entradas são git reflog expire e delete.