git / Guias

Como desfazer um commit no Git: reset, revert ou restore?

Comece pelo que você quer manter: alterações nos arquivos, histórico de commits ou ambos. Depois confira se o commit já foi compartilhado.

Os exemplos usam Bash; consulte as referências para os detalhes do seu ambiente.

Escolha conforme o estado do trabalho

SituaçãoComandoResultado
Retirar um arquivo da preparaçãogit restore --staged -- file.txtMantém as edições na árvore de trabalho.
Desfazer o último commit local mantendo as alterações preparadasgit reset --soft HEAD~1Recua a branch em um commit.
Reverter um commit já compartilhadogit revert <commit>Adiciona um commit que reverte a alteração.

Confira primeiro git status e git log --oneline -5. O exemplo de reset exige um commit pai e se aplica a uma branch privada. Um commit de merge precisa de uma análise separada; não escolha o pai principal por tentativa.

Teste um reset local em um repositório de exercício

Use um diretório novo e vazio, fora do seu projeto. O exercício cria dois commits, remove o segundo do histórico da branch e mantém sua alteração preparada para commit.

git init -b main
git config user.name "DevSheet Demo"
git config user.email "demo@example.invalid"
printf "one\n" > note.txt
git add note.txt
git commit -m "First note"
printf "two\n" >> note.txt
git commit -am "Second line"
git reset --soft HEAD~1
git status --short
git diff --cached

Resultado esperado: M note.txt no status curto e uma linha two adicionada no diff preparado. O arquivo continua com as duas linhas.

Reverta um commit compartilhado

Com a árvore de trabalho limpa, examine o commit e execute os comandos abaixo, substituindo o hash de exemplo pelo seu. O Git normalmente abre um editor para a mensagem do novo commit.

git show a1b2c3d
git revert a1b2c3d
git status

Alterações posteriores podem causar conflitos com a reversão. Resolva os arquivos e use git revert --continue, ou cancele a operação com git revert --abort. Reverter não apaga o commit original nem um segredo que ele contenha.

Evite perder alterações

git reset --hard pode descartar edições não commitadas em arquivos rastreados e sobrescrever caminhos não rastreados que atrapalhem a operação. O exercício acima não precisa dessa opção.

git restore -- file.txt substitui edições não preparadas de arquivos rastreados; com --staged, altera o índice. Se uma branch foi movida por engano, confira git reflog e crie uma branch de recuperação no commit antigo verificado. Reflog não recupera todas as alterações não commitadas.

Referências

Todos os guias