19 de julho de 2021

Adicionando alterações em commits antigos com o rebase interativo

Durante o desenvolvimento é muito comum encontrarmos alterações para fazermos em arquivos que já foram alterados e não estão mais no último PR. Para não gerar um grande número commits de ajustes pequenos podemos reorganizar estas alterações utilizando o rebase interativo.

Preciso deixar apenas um aviso importante, como alteramos a ordem dos commits isso irá gerar uma reescrita de histórico de commits, assim caso você já tenha feito o push da versão anterior para uma branch remota será necessário refazer o procedimento com o famigerado --force, o que pode trazer perdas de commits caso essa branch esteja sendo usada por outra pessoa, outro ponto, evite fazer reescrita de histórico na branch principal do projeto.

Vamos considerar o seguinte cenário: temos um pequeno projeto, primeiro eu iniciei o repositório e criei um arquivo README.md e commitei, depois criei as funções utilitárias no módulo lib.js e commitei. Por último criei o main.js para que chamará a função em questão. Todas as alterações ainda estão na minha máquina e não mergeei na master remota. A estrutura ficou como a imagem abaixo:

Estrura de arquivos e os três commits iniciais
Após isso percebi que é necessário fazer uma correção no arquivo lib.js. A primeira coisa que faço então é esta alteração e commito ela:

Agora o fix está como o último commit
Partindo do principio que esta correção era necessária, podemos entender que todos os commits desde a criação da biblioteca de funções lib.js até a correção possuem um bug e estão quebrados. Como estas alterações ainda estão na minha branch, porque não podemos organizar isso melhor? Ai entra o rebase interativo.

O rebase interativo permite reorganizar nossos commits, alterar mensagens e diversas outras coisas, para iniciar o processo no Git é muito simples, basta você rodar o comando git rebase -i HEAD~3, traduzindo: inicie o rebase interativo a partir de três commits a partir da HEAD (o último commit). Ao executar temos a seguinte tela:

Temos a lista de commits e um manual do que temos disponível no rebase
A janela que abre contém a lista de commits e algumas instruções do que podemos fazer. No nosso caso queremos juntar o commit Fix na lib.js com o commit Criada lib de funções, para isso vamos fazer duas coisas, reordernar os commits e pedir para fazer um fixup no commit de fix, ficando:

Os commits foram reordenados pedimos para aplicar fixup no commit de fix
O comando fixup irá fundir o commit de sua linha com o de cima (no caso o commit mais antigo), juntando as alterações em um único commit. Agora podemos salvar e sair para assim o rebase prosseguir até o fim:

Rebase aplicado e commits organizados
Após isso os commits estarão mais organizados, isso ajudará você a navegar melhor pelo seu histórico de commits, ajudará também os revisores que poderão fazer o review por commits e não ficar pescando trechos de códigos em diversos commits diferentes.

Nenhum comentário:

Postar um comentário