Felipe Kautzmann

Juntar vários commits em um só com Git

No Git com o poder do rebase  podemos efetuar merge de vários commits em apenas um, facilitando muito a nossa vida quando temos muitos commits e precisamos encaminhar isso a outros ambientes.

Segundo a documentação oficial o comando git-rebase é um dos comandos especializados em integrar alterações de uma branch para outra, com ele é possível reescrever o log.

Primeiro passo

Inicialize uma sessão para o rebase e visualize o conteúdo dos commits.

Logo após o HEAD temos o Nque é referente ao número de commits que você deseja agrupar a partir do último, do mais recente.

git rebase --interactive HEAD~N

Vou exemplificar abaixo uma lista imaginária de commits, adicionando o módulos "foo" ao projeto, você também pode buscar a sua lista executando o comandogit log -5, para exibir os últimos 5 commits:

12a3fs [T-2578] - Final changes module foo ---> commit mais recente
5d22oc [T-2578] - Adds unit tests
8b3sac [T-2578] - Changes module foo 2
a29m70 [T-2578] - Changes module foo
3294qa [T-2578] - Add module foo ---> commit mais antigo

Esse é um exemplo básico, utilizando o N como 5, agrupando os últimos 5 commits a partir do mais recente:

12a3fs [T-2578] - Final changes module foo --┐
5d22oc [T-2578] - Adds unit tests            |
8b3sac [T-2578] - Changes module foo 2       | --> agrupar todos em apenas 1
a29m70 [T-2578] - Changes module foo         |
3294qa [T-2578] - Add module foo           --┘

Segundo passo

Ao executar o comando anterior você deve ter caído em modo de edição com o seu editor configurado contendo os commits na forma inversa apresentada no passo anterior.

Aqui podemos definir varios comandos para os commits, os que eu mais utilizo são: pick, squash, reword, pick (p) para usar o commit, squash (s) para usar o commit mas mesclar com o commit anterior e (r) para modificar o texto de algum commit:

pick 12a3fs [T-2578] - Final changes module foo ---> commit mais recente
pick 5d22oc [T-2578] - Adds unit tests
pick 8b3sac [T-2578] - Changes module foo 2
pick a29m70 [T-2578] - Changes module foo
pick 3294qa [T-2578] - Adds module foo  ---> commit mais antigo
# Rebase 12a3fs..3294qa onto 8ow2a3s
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

Agora o nosso objetivo é marcar os commits que queremos agrupar como squashable, você pode ver mais a respeito na documentação da reescrita de histórico.

Você pode utilizar o atalho s ao invés de squash para facilitar:

p 12a3fs [T-2578] - Final changes module foo ---> commit mais recente
s 5d22oc [T-2578] - Adds unit tests
s 8b3sac [T-2578] - Changes module foo 2
s a29m70 [T-2578] - Changes module foo
s 3294qa [T-2578] - Adds module foo  ---> commit mais antigo

Segundo passo concluído! Salve as alterações e saia do modo de edição.


Terceiro e último passo

Após realizar o agrupamento agora é a hora de "commitarmos" o agrupamento, definindo um nome.

Você deve ter sido redirecionado justamente para essa sessão, onde constam as descrições de cada commit agrupado, você pode apagar todas essas linhas e definir apenas um nome para todo esse esforço.

12a3fs [T-2578] - Final changes module foo
5d22oc [T-2578] - Adds unit tests
8b3sac [T-2578] - Changes module foo 2
a29m70 [T-2578] - Changes module foo
3294qa [T-2578] - Adds module foo

Alterando para o nome que for mais coerente, exemplo:

Includes module foo

Até a próxima!

Voltar