Executando verificação de segurança...
2

Para modificar o conteudo do ultimo commit, adicionando novo conteudo, mas sem ter que criar um novo commit:

git commit --amend --no-edit

Só um detalhe importante: git commit --amend sempre cria um novo commit (ok, quase sempre, mais detalhes abaixo).

Inclusive, isso está descrito na documentação oficial:

--amend

Replace the tip of the current branch by creating a new commit.


Dá pra confirmar com um teste rápido. Suponha que meu commit mais recente é esse:

$ git log --format=fuller -1
commit cc5079bdfbefa1e465caaeeb3ea4cec79922afba (HEAD -> test)
Author:     Fulano <[email protected]>
AuthorDate: 2024-10-21 14:10:58
Commit:     Fulano <[email protected]>
CommitDate: 2024-10-21 14:10:58

    teste

Usei o formato fuller para que ele mostre o CommitDate, em breve entenderemos o motivo.

Em seguida rodei git commit --amend --no-edit, e podemos ver que ele criou outro commit:

$ git log --format=fuller -1
commit 9f4cc75088848b36783b8affd7cb02324dc4d77d (HEAD -> test)
Author:     Fulano <[email protected]>
AuthorDate: 2024-10-21 14:10:58
Commit:     Fulano <[email protected]>
CommitDate: 2024-10-21 14:12:01

    teste

Repare que o hash mudou de cc5079bdfbefa1e465caaeeb3ea4cec79922afba para 9f4cc75088848b36783b8affd7cb02324dc4d77d, ou seja, é outro commit. Isso porque, se qualquer informação do commit mudar, então o hash também muda, e portanto é outro commit. E neste caso a informação que mudou é o CommitDate (embora o AuthorDate continue igual - entenda a diferença aqui).

Ou seja, embora tenha o mesmo comentário, mesmo autor, mesmo conteúdo, etc; como uma das informações mudou, então foi criado outro commit. Portanto fique atento caso vc vá fazer amend em um commit que já foi enviado para o repositório remoto (ou seja, ele já foi enviado em um git push). Isso é inclusive citado no livro oficial:

You need to be careful with this technique because amending changes the SHA-1 of the commit. It’s like a very small rebase — don’t amend your last commit if you’ve already pushed it.


Eu disse anteriormente que --amend quase sempre cria um novo commit. O único caso em que ele não criaria um novo commit é se todas as informações forem iguais.

E tecnicamente é possível fazer o amend usando as mesmas datas.

Por exemplo, se eu tiver este commit:

$ git log --format=fuller -1
commit 430b1d3a14b8b80aaeadabbd2e645c0699f38f71 (HEAD -> test)
Author:     Fulano <[email protected]>
AuthorDate: 2024-10-21 14:22:05
Commit:     Fulano <[email protected]>
CommitDate: 2024-10-21 14:22:05

    teste

E rodar o comando usando as mesmas datas (assumindo que não fiz nenhuma outra alteração):

GIT_COMMITTER_DATE="2024-10-21 14:22:05" git commit --amend --no-edit --date="2024-10-21 14:22:05"

No fim terei "o mesmo commit", ou seja, git log --format=fuller -1 mostrará exatamente o mesmo commit com as mesmas datas.

Lembrando que isso só valerá se eu não mudar nenhuma das outras informações (como a mensagem de commit, author, alterações feitas, etc). Mas como na prática é raro as pessoas se preocuparem em manter a mesma data (e o git log por padrão só mostra o AuthorDate, que não é alterado com o amend, ou seja, dará a impressão que "é o mesmo commit, já que tem a mesma data"), então faz sentido trabalhar com a premissa de que sempre será gerado um novo commit.


Mas se ele cria um novo commit, o que acontece com o anterior? Bem, ele fica "perdido" (o nome técnico é "dangling commit"). Mas vc não precisa se preocupar com ele, pois uma hora o Git irá limpá-lo automaticamente.

Carregando publicação patrocinada...
1

Sim, você tem razão, ele cria um novo commit, foi uma parada que eu lembrei com seu comentário, no geral não afeta tanto, mas pode ser prejudicial se já foi dado push no commit