git commit --amend
Informações sobre o comando git commit --amend, formas de uso e exemplos práticos.
O que o git commit --amend faz
É fácil finalizar um commit e perceber imediatamente um erro de digitação na mensagem, ou notar que esqueceu de incluir um arquivo no stage. O comando git commit --amend é a forma mais rápida de corrigir esses erros: ele permite editar o commit mais recente do branch atual.
Em vez de empilhar um pequeno commit de correção por cima, o --amend incorpora as alterações do stage (e, opcionalmente, uma nova mensagem) ao commit anterior. O resultado é um único commit limpo, como se você tivesse acertado na primeira vez.

Ele substitui o commit, não o edita
Este é o ponto mais importante para entender sobre o --amend. Os commits do Git são imutáveis, portanto o Git não pode realmente alterar um existente. Em vez disso, o --amend constrói um commit completamente novo a partir da árvore atual mais o pai do commit antigo e, em seguida, move o ponteiro do branch para ele. O commit original fica suspenso (sem referência) até que o garbage collection o remova eventualmente.
Como o novo commit tem um snapshot e/ou mensagem diferentes, ele também recebe um hash de commit diferente. Esse único fato explica todas as regras abaixo, incluindo por que alterar commits compartilhados é perigoso.
Alterando a mensagem do commit mais recente
Se você fez um commit com uma mensagem errada ou pouco clara, execute git commit --amend para reescrevê-la sem alterar o snapshot. Passe a nova mensagem inline com -m para pular o editor:
git commit --amend -m "Fix typo in login validation"Execute git commit --amend sem opções e o Git abre seu editor preenchido com a mensagem antiga para que você possa editá-la de forma interativa. Isso é útil para mensagens mais longas com corpo.
Adicionando alterações esquecidas ao último commit
Suponha que você pretendia fazer o commit de dois arquivos em um único snapshot, mas esqueceu de incluir um deles no stage. Adicione o arquivo ausente ao stage e então faça o amend:
# You edit project.py and text.py, but only commit project.py
git add project.py
git commit -m "Add data processing helpers"
# You realize text.py belongs in that same commit
git add text.py
git commit --amend --no-editA flag --no-edit mantém a mensagem de commit existente, portanto o Git silenciosamente incorpora o text.py recém-adicionado ao commit anterior. Sem --no-edit, seu editor é aberto para que você possa atualizar a mensagem ao mesmo tempo.
Você pode combinar os dois: alterar a mensagem e incluir arquivos esquecidos de uma só vez.
git add forgotten-file.js
git commit --amend -m "Add feature with all required files"Confirme o resultado com git log
Após o amend, inspecione o branch com git log para verificar que o hash mudou e que o commit antigo desapareceu do histórico:
git log --oneline -1Um hash curto diferente ao lado da sua mensagem confirma que o amend criou um novo commit em vez de editar o antigo no lugar.
Erros comuns
--amendafeta apenas o commit mais recente. Para reescrever um commit mais antigo, use um rebase interativo (git rebase -i).- Qualquer alteração não incluída no stage é ignorada. O amend faz o commit do índice atual, portanto edições sem stage permanecem sem commit. Execute
git addprimeiro. - A data do autor é preservada por padrão, mas a data do committer é atualizada. Adicione
--reset-authorse você também quiser atualizar a identidade e a data do autor.
Evite alterar commits enviados
Como o amend produz um commit com um novo hash, o commit reescrito não corresponde mais ao que outros já baixaram. Nunca altere um commit que já foi enviado e compartilhado com outros membros da equipe: o histórico deles ainda aponta para o hash antigo, e um git push normal será rejeitado. Forçar o push (git push --force) pode sobrescrever ou duplicar o trabalho deles.
O perigo é o mesmo que resetar um snapshot público: ambos reescrevem um histórico do qual outros dependem. Mantenha o --amend apenas para commits locais e não enviados e você evita o problema completamente.
Apenas faça amend de commits que existam somente na sua máquina. Uma vez que um commit é enviado e baixado por outros, reescrevê-lo com --amend irá quebrar o histórico deles.