Antes de começar o artigo de hoje, vou contar uma pequena história: foi em meados de 2008 que eu resolvi utilizar o GIT como VCS padrão. Naquela
ocasião, eu não tinha muitos problemas com conflitos, já que o “time” era pequeno – só eu =)
Atualmente, faço parte de um time de oito desenvolvedores. Dá para imaginar que problemas na hora de fazer o rebase/merge já começam a aparecer com uma certa frequência. É gente comitando o dia inteiro!
Quando alguém no time cria um branch remoto, e trabalha nele o dia inteiro, por exemplo, ao final do dia é possível existir uma quantidade de commits consideráveis. Mas, na hora de enviar essas alterações para o repositório – git push -, pode não ser necessário enviar todo aquele histórico de commits, apenas o resultado final interessa.
Mas dá para fazer isso? A resposta é: Sim, dá!
Mas, atenção, somente faça isso em commits que ainda não foram enviados para o repositório externo. Pois, se isso já tiver acontecido, outro desenvolvedor pode ter feito outras alterações e os conflitos aparecerão para lhe trazer dor de cabeça.
A idéia é utilizar o comando git rebase interactive, ou simplesmente git rebase -i.
Cenário: Você precisa trabalhar em um defeito, e para isso você cria um branch para trabalhar nele. Ao longo do seu trabalho, você vai fazendo vários commits para manter o status do seu trabalho, já que de vez em quando você precisa pular para outro branch para resolver outra coisa, ou simplesmente testar alguma funcionalidade em outro branch que seu chefe lhe pediu (e, dependendo da situação, utilizar o comando git stash para manter o estado atual do seu branch não é a solução – veremos o comando git stash no próximo artigo). Na hora de fazer o push, você só precisa enviar o defeito resolvido. Se você desejar juntar todos os commits em um único commit que represente aquele seu defeito, siga os passos abaixo:
Veja que temos quatro commits em nosso repositório, e desejamos unir os três últimos. Para isso, vamos utilizar o comando que foi citado anteriormente:
git rebase -i master~3
O comando acima diz para fazer o rebase interativo de 3 commits a partir do master.
Feito isso, será aberto um editor para que você faça as devidas alterações:
Marque os últimos commits que você deseja juntar com o primeiro com a palavra squash. Feito isso, salve o documento e um novo editor será aberto para que você informe a mensagem para esse novo commit. No exemplo abaixo, eu deixei as mensagens de todos os commits, mas é permitido que você informe a mensagem que desejar.
Observe que agora temos apenas dois commits, ao invés de quatro:
Bastante útil. Mas use apenas se você realmente não precisar do histórico desses commits. E, para finalizar, execute git rebase continue para consolidar as alterações.