Felipe Kautzmann

Juntar vários commits em um só com Git


No Git com o poder do rebase nós podemos realizar merge com 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 em uma branch para outra e possui um capacidade poderoso de reescrita de histórico..

1. Primeiro passo

Inicialize uma sessão para o rebase: git rebase --interactive HEAD~N

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

Vou exemplificar abaixo uma lista imaginária de commits, utilizando dois módulos: bar e foo, você também pode buscar a sua lista executando o comando git log.

12a3fs finalizacao modulo     --- commit mais recente
5d22oc alteracoes no modulo
8b3sac altera deploy
a29m70 adiciona camada layout
3294qa adiciona novo modulo    --- commit mais antigo

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

12a3fs finaliza modulo foo    --- mais recente -┐
5d22oc altera no modulo foo                     |
8b3sac altera deploy foo                        | -- agrupar todos em apenas 1
c1v021 add layout modulo foo                    |
a29m70 add novo modulo foo    ------------------┘
3294qa entrega modulo bar     --- mais antigo 

Com isso teremos:

12a3fs ajustes finais modulo foo    --- novo commit (gerado pelo rebase)
3294qa entrega modulo bar           --- mais antigo 

Esse foi o comando executado para chegar nesse resultado:

git rebase --interactive HEAD~[5]

2. Segundo passo

Ao executar o comando anterior você deve ter caído em modo de edição que exibe os commits na forma inversa apresentada no passo anterior.

Aqui vocês pode definir se o commit é pick ou squash:

pick 3294qa entrega modulo bar         --- mais antigo
pick a29m70 add novo modulo foo
pick c1v021 add layout modulo foo
pick 8b3sac altera deploy foo
pick 5d22oc altera no modulo foo
pick 12a3fs finaliza modulo foo
pick 12a3fs ajustes finais modulo foo  --- novo commit (gerado pelo rebase)

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 comando s ao invés de squash para facilitar:

pick 3294qa entrega modulo bar       --- mais antigo
s a29m70 add novo modulo foo
s c1v021 add layout modulo foo
s 8b3sac altera deploy foo
s 5d22oc altera no modulo foo
s 12a3fs finaliza modulo foo
s 12a3fs ajustes finais modulo foo   --- novo commit (gerado pelo rebase)

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


3. 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.

add novo modulo foo
add layout modulo foo
altera deploy foo
altera no modulo foo
finaliza modulo foo
ajustes finais modulo foo

Alterando para o nome que for mais coerente, exemplo:

entrega modulo foo
Resumindo é outra prática muito recomendada para condensar vários trabalhos em um só.

Espero que esse artigo ajude você a organizar melhor o seu trabalho.
Dúvidas, reclamações ou sugestões podem ser feitas através das redes sociais.

Obrigado!

Voltar