squash+merge no Git
tech git scmÀs vezes, depois de terminar o trabalho num feature branch qualquer, você não deseja simplesmente fazer um merge
. Você quer dar uma “limpada” no histórico primeiro antes de fazer merge
.
Frequentemente essa “limpeza” se dá na forma de um squash
, uma junção das alterações inseridas por mais de um commit.
Por exemplo: o repositório desse site tem um branch main
com histórico relativamente “limpo”. Cada commit representa um novo conteúdo no site ou uma nova funcionalidade. O workflow que faz deploy do site é disparado cada vez que eu faço um push
em main
.
Eu criei um branch local chamado fediverse_comments
para trabalhar na funcionalidade de comentários. Era uma funcionalidade nova, eu não sabia exatamente quantos commits eu precisaria fazer. Estava experimentando muita coisa. Então, mesmo sendo local, não quis fazer bagunça em main
.

Branch main "limpo" e feature branch fediverse_comments "sujo" antes do merge.
Depois de 5 commits em fediverse_comments
(na imagem acima só aparecem 4, mas fiz mais um depois de tirar o screenshot) me dei por satisfeito. Era hora do merge
.
Eu normalmente faria:
-
git rebase -i
para transformar os commits emfediverse_comments
em um ou mais commits “limpos”, ou seja, commits que eu estaria OK em trazer viamerge
paramain
-
trocaria para o branch
main
-
faria o
merge
com ofediverse_comments
(agora já “limpo”)
Eu achava um pouco “indireto” demais “limpar” um branch que em breve estaria em desuso para só depois fazer merge
, mas era como eu sabia fazer e nunca me questionei muito.
Pois bem, descobri uma forma que me pareceu mais intuitiva semana passada. O comando merge
já possui uma flag --squash
que faz o que eu precisava.
Então, depois de terminar os trabalhos em fediverse_comments
, foi só trocar para main
e dar o seguinte comando:
git merge --squash fediverse_comments
O que esse comando faz é colocar no working directory e na staging area todas as alterações em fediverse_comments
. Porém, não faz commit
. Acho isso positivo porque me dá a oportunidade de dar uma última revisada ou de fazer mais alguma alteração no commit.
Não precisei nessa situação, então fiz um commit de mensagem Adiciona comentários pelo fediverso
em main
.

Branch main "limpo" com um único commit com todas alternações feitas em fediverse_comments.
Dessa forma, meu main
ficou apenas com commits “limpos” e poupei a etapa de fazer squash
no feature branch. Devo fazer mais dessa forma no futuro.