W3docs

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.

git commit --amend

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-edit

A 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 -1

Um 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

  • --amend afeta 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 add primeiro.
  • A data do autor é preservada por padrão, mas a data do committer é atualizada. Adicione --reset-author se 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.

Aviso

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.

Prática

Prática
Quais são as afirmações corretas sobre o comando `git commit --amend`?
Quais são as afirmações corretas sobre o comando `git commit --amend`?
Was this page helpful?