Juntando vários commits no Git
Controle de versão, Git May 21st, 2009Foi no ano passado que comecei a utilizar o GIT como VCS padrão. Naquela ocasião, não tinha muitos problemas de conflitos, já que o “time” era pequeno - só eu =)
Hoje, faço parte de um time de 8 desenvolvedores. Já 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 git rebase –interactive, ou simplesmente git rebase -i.
Imagine o seguinte cenário: Você precisa trabalhar em um defect, 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 enquando 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 git stash não é a solução). Na hora de fazer o push, você só precisa enviar o defect resolvido. Se você desejar juntar todos os commits em um único commit que represente aquele seu defect, siga os passos abaixo:
Veja que temos 4 commits em nosso repositório. E desejamos unir os três últimos commits. 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 2 commits, ao invés de 4:
Bastante útil. Mas, use apenas se você realmente não precisar do histórico desses commits.
UPDATE 1: Execute git rebase –continue para consolidar as alterações.




October 8th, 2010 at 5:16 pm
tô com uma dúvida bem + simples. é o seguinte: defini o ‘gedit’ como meu editor de commits; no terminal, ao digitar ‘git commit -a’, o gedit é aberto; digito as alterações, salvo, porém o commit não é ‘efetivado’… o que eu tenho de fazer para efetivamente ‘comitar’ ?
October 8th, 2010 at 7:18 pm
Olá Paulo. Quando você abre o gedit, o terminal fica “travado”, esperando que você faça as modificações necessárias, e somente após vc fechá-lo é que o commit será realizado e o terminal liberado.
Vc pode passar o nome do commit direto no commando: git commit -a -m ‘text goes here’ também, fica a dica =)