Desenvolvimento

4 set, 2015

Como fazer squash de commits no Git

Publicidade

Não sou um expert de git, mas sei o suficiente para me virar bem, e com certeza sei o suficiente sobre git para gostar mais dele do que do svn. Um tempo atrás publiquei sobre alguns comandos básicos de git, ensinando como ir além do básico dos clones e commits, passando pela maioria das interações que o git fornece. A mini-lição de hoje envolve fazer o squash de múltiplos commits em um só, facilitando a revisão de pull requests e ajudando com a gestão de merges.

Comece fazendo alterações no feature branch onde você vai trabalhar. Vamos supor que essas alterações são alguns commits que eu quero consolidar num único. O primeiro passo consiste em garantir que o branch master está sincronizado com o branch master do repositório destino:

# entre no branch master
 git checkout master
# garanta que seu repositório está atualizado
 git pull nomeRepositorioRemoto master

Com o branch master sincronizado, usamos o git rebase para fazer a consolidação:

git rebase -i master

Esse comando mostra uma lista de commits, dessa forma:

pick fb554f5 This is commit 1
pick 2bd1903 This is commit 2
pick d987ebf This is commit 3

# Rebase 9cbc329..d987ebf onto 9cbc329
#
# 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
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

Edite o sumário mostrado pelo comando rebase, deixando o commit que você quer deixar principal como “pick”, e alterando todos os comandos “pick” subsequentes por “squash”:

pick fb554f5 This is commit 1
squash 2bd1903 This is commit 2
squash d987ebf This is commit 3

# Rebase 9cbc329..d987ebf onto 9cbc329
#
# 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
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

Salve o conteúdo e feche o editor duas vezes (a segunda tela permite que você altere a mensagem de commit, apesar de eu preferir manter sempre a mesma mensagem). Nesse momento, seus commits serão aglutinados em um só: é o squash! Execute o seguinte comando para forçar o push desse commit novo e consolidado.

# Force um push
git push -f

Esse push forçado atualiza o repositório fonte, e nossos commits são transformados em um só. Se você já tinha mandado um pull request no GitHub com esse conteúdo, agora o PR vai aparecer como um único commit! E, com um commit consolidado, a revisão do código se torna muito, mas muito, mais fácil!

É isso aí, pessoal, até mais!

 

Tradução livre de Squash Commits with Git, disponível em http://davidwalsh.name/squash-commits-git/