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

Quanto mais mexemos com git mais descobrimos coisas mirabolantes que ele pode fazer. Descobri há um tempo atrás uma maneira de organizar/alterar seus commits e que me ajudou bastante.

Editar commits? Pra que? Pois é. Alguns casos:

Um exemplo rápido

Um exemplo simples e rápido. Imagine que no seu projeto você fez uma alteração e fez um commit:

Aí você lembrou que tinha que atualizar o README (ou preferiu deixar em commits separados) do projeto:

Então você sai pra pegar um chá (não bebo café ¯\_(ツ)_/¯) e no meio do caminho lembra que faltou uma alteração de CSS. Aí você volta, faz a alteração e comita novamente:

Se rodássemos um simples log para ver os commits teríamos algo assim (limitei apenas aos 3 últimos, para o exemplo):

Se o projeto é pequeno/pessoal, até daria pra deixar assim, no entanto, quando estamos trabalhando com outras pessoas em um projeto grande, pode ficar meio estranho no conjunto da história. É aí que entra o interactive rebase. Com ele conseguimos alterar commits em um mesmo branch. Paremos de falar e vamos ao que interessa.

Como faço?

Rodamos o comando acima onde o:

Feito isso aparecerá uma tela similar a essa abaixo (todas telas citadas abaixo irão abrir no seu editor que estiver setado como default):

Reordenando commits

No exemplo acima poderíamos alterar a ordem dos commits deixando juntos os que são relacionados ao mesmo tema por exemplo. Pra isso, na tela anterior, edite a ordem copiando e colando as linhas na ordem que preferir. Para o exemplo, poderíamos algo mais ou menos assim:

E … pronto! Se Se ocorreu tudo certo aparecerá uma mensagem mais ou menos assim:

Pode ser que conflitos ocorram, nesse caso o rebase para até que você o corrija. Depois é só rodar um git rebase --continue para seguir ou um git rebase --abort se quiser desistir de tudo.

Alterando mensagens

Outra coisa beeeem bacana é a possibilidade de alterar a mensagem de um commit. Voltando ao nosso exemplo, agora queremos trocar a mensagem do commit do README.

Rodamos novamente o rebase:

Caímos novamente naquela tela com a listagem dos commits. Aí digitamos reword no commit que quisermos editar a mensagem.

Feito isso, caíremos em outra tela, similar a essa:

Aí é só taca-le pau na nova mensagem.

E… pronto! \o/ Se rodarmos um log simples, veremos a lista dos commits com a mensagem atualizada:

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 pushcom a flag --force.

Tem mais..

Pra não ficar muito extenso, dividi o assunto em 2 posts. No próximo vamos falar de mesclar commits e dividir um commit em dois. Aqui você consegue ler a segunda parte do artigo.

Obs.

Ver mais posts