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.