git: como juntar vários commits em apenas um
Quando usamos o git para versionamento do nosso código, principalmente quando trabalhamos em equipa, funcionalidades novas são desenvolvidas numa nova branch, diferente da branch principal que normalmente tem sido a “master“. Acontece que, durante o desenvolvimento da nova funcionalidade, vários commits podem ser enviados ou submetidos. Isso pode acontecer ou porque esquecemos de algum detalhe no código, ou porque tentamos melhorar (refactor) o código depois de ser analizado ou depois de um feedback do colega.
Na medida que estas alterações forem sendo comitadas, a nossa branch fica toda poluída com vários commits como mostra a imagem abaixo:
Como podemos observar, para concluir a nossa “super funcionalidade” foi necessários 3 commits. Desta forma, temos a nossa funcionalidade desenvolvida e estamos prontos para fazer um pull request para que a nossa super funcionalidade seja mesclada ao código principal (branch master).
E podemos fazê-lo já, enviando as alterações para o repositório remoto e fazer o pull request, ou passar para a branch master e fazer o merge. Contudo, isso deixaria o histórico dos nossos commits poluído. A solução passa em juntarmos todos os commits referente a esta funcionalidade num só. Para isso, o git traz consigo uma ferramenta que nos permite fazer isso, o git rebase.
O comando que precisamos executar é o seguinte:
$ git rebase -i HEAD~3
Perceba o número 3 no final do comando. Ele serve para dizer ao comando que precisamos juntar os três últimos commits. Ou seja, se quisessemos juntar 5 últimos commits, bastava mudar o número 3 por 5. O comando acima nos dará o seguinte resultado:
Executando o camando acima, o git abre o editor de texto, configurado como padrão para git, que no meu caso é o vim, onde estarão listados os três últimos commits que pretendemos juntar. No nosso caso, pretendemos juntar os dois últimos com o primeiro. Para isso, mudamos o comando “pick” que aparece antes do commit para “squash“, apenas para os commits que pretendemos mudar. Ficando assim:
Gravando este arquivo, um outro editor será aberto, onde podemos mudar a descrição do nosso único commit como aparece na imagem abaixo:
Perceba que todo texto precedido por cardinal (#), é ignorado. Gravando este arquivo, ficaremos apenas com um commit com a descrição “funcionalidade permite a pessoa correr“.
Agora, consultado o log, teremos algo como:
Diferente do primeiro resultado, agora só temos um commit com todas as alterações que fizemos para esta funcionalidade. Com isso, temos um histórico mais limpo que o anterior. O nosso código está pronto para ser mesclado na brach master.
É isso aí, qualquer dúvidas ou sugestão, deixa nos comentários.
Abraços e até a próxima.