Git: Desfazer um commit
Última atualização
Como desfazer um commit depende de qual commit é e de ele já ter sido enviado ou não. Um commit antigo enterrado no seu histórico - ou qualquer coisa já compartilhada - pede git revert, que adiciona um novo commit revertendo-o sem reescrever nada. Uma sequência de commits locais recentes pode simplesmente ser desfeita com git reset. Se tudo o que você precisa é desfazer o commit mais recente, a página git desfazer último commit cobre todas as variantes dessa correção rápida.
Experimente estes comandos no terminal playground: um shell real no seu navegador, sem nada para instalar.
Qual comando usar
| Situation | Command |
|---|---|
| Desfazer um commit antigo, mantendo tudo o que veio depois | git revert <hash> |
| Desfazer um commit que você já enviou | git revert <hash> |
| Desfazer os últimos 3 commits locais, mantendo o trabalho | git reset --soft HEAD~3 |
| Desfazer os últimos 3 commits locais, descartando o trabalho | git reset --hard HEAD~3 |
| Desfazer um intervalo com novos commits de reversão | git revert HEAD~3..HEAD |
reset vs revert
| Behavior | git reset | git revert |
|---|---|---|
| Reescreve o histórico | Sim | Não |
| Seguro em commits enviados | Não | Sim |
| Cria um novo commit | Não | Sim |
| Funciona em commits antigos no meio do histórico | Não | Sim |
| Pode descartar alterações | Sim (--hard) | Não |
Exemplo prático
Desfaça um commit antigo específico - mesmo um que já foi enviado - sem tocar nos commits que vieram depois dele.
| Step | Command | Result |
|---|---|---|
| 1 | git log --oneline | Encontre o hash do commit ruim (ex.: a1b2c3d) |
| 2 | git revert a1b2c3d | Um novo commit o reverte; os commits posteriores ficam intactos |
| 3 | git push | Compartilhe a correção - nenhum histórico foi reescrito |
Perguntas frequentes sobre desfazer commit no Git
Como desfaço um commit antigo sem perder os commits que vieram depois?
git revert <hash>. O revert cria um novo commit que reverte apenas o commit que você indicar - todos os commits posteriores permanecem exatamente como estavam. Encontre o hash antes com git log --oneline. Se o revert conflitar com alterações posteriores, o Git pausa para você resolver e executar git revert --continue.Como desfaço vários commits de uma vez?
git reset --soft HEAD~3 remove os três últimos mantendo as alterações deles no stage (use --hard para descartá-las). Para commits já enviados, reverta o intervalo: git revert --no-commit HEAD~3..HEAD reverte os três, e então um único git commit registra a operação de desfazer.Como desfaço um commit que já enviei?
git revert <hash> em vez de reset. O revert cria um novo commit que desfaz as alterações do commit alvo, deixando o histórico intacto. Essa é a forma segura de desfazer commits compartilhados: reescrever o histórico enviado com reset força todos os outros a reconciliar suas cópias.