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:

screen-shot-2016-12-03-at-19-20-31

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:

screen-shot-2016-12-03-at-19-32-21

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:

screen-shot-2016-12-03-at-19-33-41

Gravando este arquivo, um outro editor será aberto, onde podemos mudar a descrição do nosso único commit como aparece na imagem abaixo:

screen-shot-2016-12-03-at-19-35-42

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:

screen-shot-2016-12-03-at-19-36-26

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.

,,,,