Utilizando o git rebase
é possível esmagar vários commits em apenas um. Porque isso é interessante?
- As funcionalidades ou correções de bugs devem ser "atômicas", ou seja, entregues em 1 commit apenas.
- Facilita o rastreamento da funcionalidade e identificação de todas as mudanças de código que foram feitas na funcionalidade.
- Torna-se MUITO mais fácil reverter uma funcionalidade quando detectamos que ela inseriu um defeito no código.
Antes de começar, verifique a regra de ouro:
Faça rebase apenas em commits de branches onde você é o único desenvolvedor
Assumindo que temos os seguintes commits exibidos pelo comando git log
:
Podemos esmagar quantos commits quisermos em apenas 1 da seguinte forma:
git rebase -i HEAD~3
onde HEAD
indica o nosso commit atual, e 3 é o número de commits que queremos analisar. O número pode ser maior, já que esse comando por si ainda não completa o squash.
Quando executarmos esse comando, a seguinte tela será exibida:
Perceba que a ordem dos commits está invertida comparada com o git log
. Os commits mais recentes estão abaixo. Os comentários mostram as opções disponíveis: se quisermos juntar os commits 2 e 3 sobre o commit 1, só precisamos trocar a palavra "pick" por "squash" (ou simplesmente "s") sem aspas, nos commits que queremos esmagar. Nossa edição deve ficar desta forma:
Precisamos então salvar e sair do nosso editor. Se estiver usando o nano, as instruções para sair encontram-se na parte debaixo da tela (Ctrl+X
, seguido de um S/Y para confirmar, e um ENTER
). Se estiver utilizando o vi/vim, pressione ESC
, seguido de :wq
, e ENTER
.
Por fim o git permitirá a edição da mensagem de commit. Por padrão ele mostrará as 3 mensagens de commit, além de linhas que começam com #
que são comentários e não aparecerão na mensagem final. Altere a vontade a mensagem, salve o arquivo e saia.
Para atualizar o branch remoto (já que alguns commits foram destruídos e outros tiveram a referência alterada), utilize o commando git push --force-with-lease
.