Git School · FluxGit

Desfazer git reset --hard com reflog

FluxGit ·

Os blocos são casos diferentes, não um script único. Escolha o caso do seu repositório. Substitua branches, caminhos e VERIFIED_COMMIT antes de usar. Comandos de cancelamento só valem para sua operação ativa; não execute ambas as alternativas.

Resposta curta

Após git reset --hard, encontre o commit anterior no reflog, confira seu conteúdo e crie uma branch de resgate. O objeto do commit precisa continuar armazenado.

Exemplo e condições

Este fluxo recupera trabalho que foi commitado. O reflog não guarda alterações que existiam apenas no diretório de trabalho.

Inspecione antes de alterar

Evite novos resets, rebases e trocas de branch. Leia git reflog e confira git show antes de mover referências.

git status --short
git reflog --date=iso
git show VERIFIED_COMMIT

Mantenha referência ou checkout separado

Crie rescue/lost-work em VERIFIED_COMMIT. Assim o commit recebe uma referência sem alterar sua branch atual nem sobrescrever os arquivos.

git branch rescue/lost-work VERIFIED_COMMIT
git log -5 --oneline rescue/lost-work

Primeiro fluxo

Revise o histórico e o patch da branch recuperada. Você pode examiná-la em outro checkout ou integrar conscientemente o trabalho necessário.

Escolha o outro resultado deliberadamente

Um reset direto ao commit recuperado altera novamente a branch, o índice e os arquivos. Preserve primeiro o trabalho atual e uma referência de resgate.

Limites e exceções

HEAD@{1} indica uma posição do reflog, não garante o commit correto. ORIG_HEAD pode apontar para a ponta anterior, mas outras operações podem substituí-lo.

Conflitos e limpeza

A expiração do reflog e a remoção de objetos têm políticas configuráveis separadas. Se o objeto foi removido, uma entrada antiga não o reconstrói.

Confira o resultado

Confira o commit, os arquivos e o histórico da branch de resgate. Execute os testes pertinentes antes de integrar as alterações.

git show --stat rescue/lost-work
git status --short

Perguntas frequentes

git revert cria um commit inverso e não devolve a branch à posição anterior. Para conteúdo apenas preparado, git fsck pode encontrar blobs, sem garantir nomes ou estrutura.

Revise a operação no FluxGit

O FluxGit reúne movimentos do reflog e pontos de restauração na Safety Timeline. Com a função habilitada e alterações locais detectadas, um reset coberto pode salvar um stash de segurança; o reset no terminal do tutorial não usa essa proteção.

Referências oficiais do Git

Git School · 1:50

Desfazer git reset --hard: recupere seu commit perdido

Recupere uma alteração commitada após git reset --hard usando o reflog local enquanto o objeto do commit ainda estiver disponível. A recuperação não é garantida após a expiração do reflog ou a limpeza dos objetos.

Desfazer git reset --hard: recupere seu commit perdido
Narração em inglês. Há legendas manuais no YouTube em 11 idiomas. Esta transcrição está em português brasileiro.

Assistir no YouTube — abre uma nova aba

Gravado em um repositório de teste.

Ler a transcrição da narração
  1. 00:03 Você executou git reset --hard e seu último commit desapareceu. Todo mundo faz isso uma vez. Veja como recuperá-lo e por que funciona.
  2. 00:12 Primeiro, uma alteração já commitada: tentar a chamada de pagamento mais duas vezes.
  3. 00:19 Depois, no terminal: git reset --hard HEAD~1.
  4. 00:24 O FluxGit percebe na hora. A branch voltou para um commit anterior, e aquele commit já não está nela.
  5. 00:31 Veja por que ele não foi perdido. Uma branch é apenas um rótulo em um commit. O reset move o rótulo para trás, mas o commit continua no repositório, e o reflog, o diário do Git, ainda o lista. Crie uma branch nele, e ele estará de volta.
  6. 00:47 No FluxGit, Recover lost work explica isso em palavras simples e leva você ao lugar certo.
  7. 00:59 A Safety Timeline mostra o reset em uma frase. A partir do momento anterior ao reset, crie uma branch.
  8. 01:06 Seu commit está de volta, em sua própria branch.
  9. 01:10 O trabalho sem commit não aparece no reflog. Com os pontos de restauração ativados e alterações locais detectadas, o FluxGit pode salvar um stash de segurança antes de um reset hard. Este reset executado diretamente no terminal do Git ignora essa proteção.
  10. 01:26 O mesmo no terminal: git reflog, encontre a linha anterior ao reset e crie uma branch naquele commit.
  11. 01:34 Recapitulando. Um reset move um rótulo. O reflog lembra onde ele estava. Crie uma branch para preservar o commit. Próxima aula: recuperar uma branch excluída.

Fluxos relacionados

Baixar FluxGit