Desfazer o último commit Git: soft reset ou revert
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
Para desfazer o último commit local mantendo alterações, reset --soft move a branch ao pai sem modificar índice e arquivos. Para desfazer um commit compartilhado, revert acrescenta um commit inverso. Decida antes se quer manter o código e se outras pessoas possuem esse histórico.
Exemplo e condições
O exemplo tem um commit comum, sem merge e com pai, na ponta atual, com árvore limpa e sem trabalho alheio no índice. O primeiro commit não tem pai HEAD^; merge tem vários. Nenhum corresponde ao atalho. Examine o grafo em vez de tratar HEAD~1 como botão universal de desfazer.
Inspecione antes de alterar
Leia patch, status e compartilhamento da branch. Tirar o commit para continuar o código, inverter código publicado e descartar tudo são resultados diferentes. Coordene antes de reescrever histórico publicado. Data recente ou seu nome de autor não prova que o commit é privado.
git status --short
git log -3 --oneline --decorate
git show --stat HEADMantenha referência ou checkout separado
Crie rescue/before-undo em HEAD para manter o estado confirmado original. Salve arquivos sem commit à parte; a branch não os guarda. No exemplo limpo, soft reset deixa no índice só aquele patch. Um índice já modificado pode combinar várias tarefas no diff resultante e exige revisão própria.
git branch rescue/before-undo HEAD
SCHOOL_UNDO=$(git rev-parse HEAD)Primeiro fluxo
No caso local que preserva mudanças, execute reset --soft HEAD^ e confira diff --cached. O conteúdo continua no índice e na árvore, pronto para outro commit. Reset mixed tem efeito diferente no índice. Não use --hard só para encurtar o status: ele também altera arquivos de trabalho.
git reset --soft HEAD^
git diff --cached
git status --shortEscolha o outro resultado deliberadamente
Para commit comum compartilhado, guarde seu ID verificado em SCHOOL_UNDO e use revert. O novo commit inverte a alteração e mantém o histórico recebido pelos colegas. Confira resultado e verificações antes de push normal. Merge exige selecionar o pai principal e entender efeitos em merges futuros; use procedimento específico.
git revert "$SCHOOL_UNDO"Limites e exceções
Revert pode conflitar com trabalho posterior. Leia status, resolva e prepare os arquivos e use revert --continue. Use revert --abort se escolheu a alteração ou resultado errado. Reset --soft não possui estado correspondente de continuar ou abortar. Não misture os fluxos com um revert ainda ativo.
git status
git revert --abortConflitos e limpeza
Descartar também código confirmado e arquivos locais é outra decisão destrutiva, não o padrão deste guia. Preserve e confira o estado primeiro. Trabalho sem commit não está no reflog. Com restore points ativados e mudanças locais detectadas, FluxGit pode salvar um safety stash antes de hard reset suportado; este terminal não aciona aquela proteção.
Confira o resultado
Depois de soft reset, compare ponta e patch preparado com o resgate. Depois de revert, confira que o inverso só altera o desejado e mantém trabalho posterior útil. Execute verificações relevantes. Guarde o resgate durante a revisão; um comando concluído sem erro não prova correção do código.
git log -4 --oneline --decorate
git status --short
git diff --cachedPerguntas frequentes
Soft reset apaga arquivos? Mantém árvore e índice, movendo a referência. Revert remove o original? Não, registra outra alteração inversa. Reflog recupera tudo? Não: trata estados locais retidos e objetos confirmados, não conteúdo arbitrário de arquivos não salvos.
Revise a operação no FluxGit
Use o histórico visual e a visão de alterações do FluxGit para revisar a operação e os commits relevantes. Mantenha as verificações de branch, compartilhamento e arquivos locais do exemplo. A página de download apresenta os builds e plataformas disponíveis.