Git: Alterando seus commits com rebase - parte 2/2

No post anterior, vimos duas das coisas que são possíveis de se fazer com o rebase interativo:

  • alterar a ordem dos commits;
  • editar as mensagens.

Nesse post vamos ver como mesclar dois commits em apenas um e, o processo inverso, de dividir um único commit em dois.

Relembrando

Voltando ao exemplo do post anterior (recomendo que você leia, pra se atualizar com o fluxo), rodamos novamente o comando:

Após isso, caímos na tela abaixo:

Até aqui nada de novo. Então vamos lá..

Mesclando commits

Vamos mesclar os dois commits relacionados aos ajustes de CSS e JS do slideshow, que provavelmente mexeram coisas semelhantes (senão as mesmas coisas) e talvez tivesse mais sentido se ficassem juntos em apenas um commit.

Para isso, digitamos squash em um commit. Fazendo isso o moço git entende que queremos mesclar esse commit marcado com o anterior (no caso, o de cima).

Feito isso, caíremos numa tela que mostra as mensagens dos dois commits:

Agora é só apagarmos ou comentarmos as duas linhas de mensagens dos commits e inserirmos a nova mensagem:

E.. pronto! Agora se rodarmos um log dos commits, veremos algo similar a isso:

Dividindo um commit

Sabe-se lá Deus por que, mas agora queremos reverter o processo anterior e dividir o commit que foi mesclado anteriormente (brincadeiras a parte, podemos fazer isso por exemplo, em commit que englobou muita alteração e que talvez pudéssemos querer dividir melhor o caminho que percorremos). Rodamos o rebase:

Iremos cair nessa tela que já estamos acostumados, eaí trocamos o pick por edit no commit que quisermos editar.

Saindo do modo de edição e continuando iremos chegar aqui:

Essa parte é legal. O que aconteceu aqui foi que o rebase parou no commit que especificamos. Temos agora três opções:

  • git commit --amend => para editar o commit editando/adicionando um arquivo.
  • git rebase --continue => para seguir em frente com o rebase e não fazer nada (use esse comando também após o anterior para continuar com o rebase).
  • git reset HEAD^ => Volta o commit em que estamos parados.

Nesse ponto se rodarmos um git status veremos os arquivos que foram modificados nesse commit :

Agora podemos adicionar os arquivos e commitar. Aqui que teoricamente você faz a divisão dos commits. Para o nosso exemplo, poderíamos fazer algo assim:

O que fizemos acima foi adicionar os arquivos por partes e fazer commits. Com tudo feito, é só continuarmos o rebase:

E… pronto! Se formos olhar o log, teríamos agora algo similar a isso:

Forçando o push

Como bem lembrado pelo Cícero Pablo, quando utilizamos o rebase interativo, caso você já tenha um repositório com uma história de commits, será preciso fazer push com a flag --force.

Obs.

  • Os nomes/estrutura dos arquivos e mensagens de commit são a títulos de exemplo.
  • Usei a palavra tela para referenciar cada retorno do terminal.
  • Uso por padrão como editor o vim, o que facilita a edição das telas que comentei no tópico anterior.
See all posts...