Fazendo squash de commits com git rebase

18/06/2015 Alexandre Vicenzi 2 min de leitura

Eventualmente trabalhamos em algo grande, e acabamos por fazer vários micro commits. Se você gostaria de juntar esses micro commits em um único no fim da implementação e não sabe como, eis a solução. O squash irá unir vários micro commits em um único commit. Sendo assim, se pode juntar uma alteração que tem 10 commits em apenas um único commit.

Git Squash Rebase

Na imagem acima é possível observar que os commits antigos geram um novo commit unindo todas as alterações.

Obs: Antes de fazer qualquer alteração desse tipo, recomendo fazer um backup do repositório e sempre ler com atenção toda e qualquer mensagem que aparecer.

Agora vamos ver como fazer o squash dos últimos 4 commits. Para isto execute o comando abaixo:

git rebase -i HEAD~4

Deverá aparecer os commits a serem mesclados, como abaixo:


pick 6f7823b Add Nginx reload tasks.
pick db22ae4 Change nginx port to use HAProxy.
pick 14bc6ad Change nginx port.
pick c0dbc9a Remove old config files.

# Rebase 9ecdcb0..c0dbc9a onto 9ecdcb0 (4 TODO item(s))
#
# 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

A primeira linha deve ser pick, as demais squash (ou s). Como abaixo:


pick 6f7823b Add Nginx reload tasks.
s db22ae4 Change nginx port to use HAProxy.
s 14bc6ad Change nginx port.
s c0dbc9a Remove old config files.

Salve.

Deverá aparecer uma mensagem mostrando o status do rebase, como abaixo:

Rebasing (1/4)

E após deverá exibir a união dos commits, igual um commit normal, mas lembre-se que todas as mensagens de commits estão juntas, se você preferir pode remove-las.

Salve.

Deverá exibir a mensagem:

Successfully rebased and updated refs/heads/master.

Agora basta fazer o push, lembre-se que terá de forçar o push, pois ele irá sobrescrever os commits antigos. Para isto basta executar o comando:

git push -f

Pronto!