Elimine seus commits com git rebase

Não sei se este já foi abordado antes, mas não consegui encontrá-lo na minha lista de protips, então compartilho de qualquer maneira.

Há momentos em que você está trabalhando em um grande recurso e tem muitos commits que dificultam a revisão do código.

Além disso, muitos de nós realmente se comprometem cedo, comprometem-se frequentemente por diferentes razões, seja teste de unidade ou teste de código em diferentes regiões. No entanto, este é um truque bacana para combinar todos os seus commits juntos.

Você pode usar git rebasepara combinar tudo junto.

Digamos que você tenha um branch com 4 commits. git log --oneline -4:

766c833 Finishes Payment Module
5baaa20 Add a few more files
630e451 Modify some code
03b37e9 Add Gateway API classes

Podemos combinar esses commits fazendo um rebase para o primeiro commit. Existem duas maneiras de fazer isso. Você pode fazer git rebase -i <commit-hash>OR git rebase -i HEAD~4.

O Git agora irá colocá-lo em um editor com o texto acima e uma pequena explicação do que pode ser feito. Você tem muitas opções disponíveis para você nesta tela, mas agora vamos apenas compactar tudo em um commit. Portanto, alterar as primeiras quatro linhas do arquivo para isso resolverá o problema:

pick 03b37e9 Add Gateway API classes
squash
630e451 Modify some code
squash
5baaa20 Add a few more files
squash
766c833 Finishes Payment Module

Basicamente, isso diz ao Git para combinar todos os quatro commits no primeiro commit da lista. Se você rebasear usando a HEADopção, outro editor aparecerá quando isso for feito. Isso é para modificar as mensagens de confirmação.

Se você quiser que tudo seja mesclado em um único commit e não combinado no primeiro commit, você pode resetramificar para o primeiro commit, adicionar todos os arquivos e corrigir a mensagem de commit.

Com o mesmo exemplo acima:

$ git reset 03b37e9
$ git log
--oneline -1
03b37e9 Add Gateway API classes

Quando você faz um git status, ele mostra todas as alterações não confirmadas. Basta adicionar todos os arquivos novamente:

git add .

e, envie-os com uma nova mensagem:

git commit -a --amend -s -m "Finishes CCAvenue integration"

Isso nos dará um galho totalmente esmagado.

$ git log --oneline
2268cc6 Finishes CCAvenue integration

Referências

@owocki

http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html

http://feeding.cloud.geek.nz/2010/08/combining-multiple-commits-into-one.html