Git rebase: integrando alterações de uma branch em outra

O Git facilita muito o dia a dia de uma pessoa desenvolvedora por possuir diversos comandos que executam exatamente o que precisamos, assim como o comando git rebase, que permite editar, enfileirar e alterar uma variedade de commits.

Porém, seu uso precisa ser feito com cautela, pois pode acarretar alguns problemas, principalmente se você estiver trabalhando na mesma branch que um colega de equipe.

Mas, ainda assim, o git rebase é de suma importância quando a branch que você está trabalhando fica desatualizada em relação à branch principal. Vamos entender melhor a seguir!

Vamos lá!

O que é o Git rebase e para que serve?

O git rebase é um comando utilizado quando precisamos alterar um ou vários commits.

Você provavelmente já vivenciou a situação em que está fazendo um commit e se depara com o momento de escrever um comentário, porém, você não consegue pensar em nada que defina o que estava desenvolvendo. Por conta disso, você escreve qualquer coisa só para subir logo as suas alterações para o GitHub.

Mas, sabemos que isso não é nem de longe uma boa prática. Então, depois de tomar um café e dar uma relaxada, você consegue pensar em um comentário que defina o que você estava desenvolvendo. Para alterar esse commit, você pode usar o comando git rebase, pois ele possibilita que os comentários dos commits sejam modificados.

Com o git rebase também é possível unificar diversos commits em um único commit. Por exemplo: você criou uma branch para si a partir da branch principal, logo, a branch que você criou está atualizada. Mas, houve algum imprevisto e você ficou sem desenvolver por um tempo e, consequentemente, sem atualizar a sua branch. Seu time time atualizou a branch principal, logo, quando você for tentar subir as suas alterações para a branch principal, terá conflito.

Para impedir que isso aconteça, você pode utilizar esse comando e enfileirar a sua branch a partir do último commit atualizado. Dessa forma, o git rebase vai pegar o seu commit e enfileirá-lo com os últimos commits da branch principal, como mostra a imagem abaixo.

Exemplo git rebase: como acontece

Além disso, também é possível excluir commits que já não são mais necessários ou que estão causando algum bug na aplicação.

Quais as diferenças entre Git rebase e Git merge e quando usá-los?

Para entendermos a diferença entre o git merge e o git rebase, vamos primeiro entender suas individualidades.

Como falamos acima, quando você e sua equipe trabalham seguindo corretamente o Git Flow, cada membro do time que estiver trabalhando em uma funcionalidade individual criará uma branch a partir da branch atual, que provavelmente será a branch main.

A branch main é a branch principal. É para ela que todas as pessoas desenvolvedoras envolvidas no projeto mandarão suas alterações ao final do desenvolvimento e com a certeza de que tudo está funcionando como deveria, sem bugs. Porém, pode acontecer de alguém enviar suas alterações direto para a branch main e todos os outros desenvolvedores ficarem com suas branchs desatualizadas.

Com isso, quando você realizar os comandos para mesclar a sua branch de desenvolvimento com a branch principal, terá conflitos e para resolver isso, você tem a opção de utilizar o git merge.

Para isso, você fará os seguintes comandos após resolver os conflitos:

git checkout suabranch
git merge main

Basicamente, o git merge permite que você pegue linhas de comandos independentes e integre em uma ramificação única, sem alterar a branch principal e adicionando apenas um commit para a sua branch de desenvolvimento.

Já o git rebase se enquadra no mesmo cenário, porém, ele unificará as branchs e permitirá que tenhamos um histórico linear. Entretanto, veremos mais abaixo que, ao utilizá-lo, podemos ter alguns problemas.

 git checkout suabranch
 git rebase main

Como vimos acima, ambos se encaixam no mesmo cenário, porém, você provavelmente verá as pessoas desenvolvedoras utilizando mais o git merge, pois o git rebase oferece muitos riscos e não é nada recomendável utilizá-lo em branchs públicos.

Git rebase interativo e não-interativo: conheça os dois tipos de rebase!

Existem dois tipos de rebase: o Rebase não interativo e o rebase interativo. Vamos conhecer melhor os dois.

Rebase não interativo

O git rebase não interativo “pega” os commits de uma branch de origem e enfileira com os commits da branch de destino. Isso faz com que os commits da branch de origem façam parte do histórico da branch de destino.

Rebase interativo

Quando você cria um repositório no GitHub, uma branch e começa a fazer commits, você está, basicamente, escrevendo uma história sobre o desenvolvimento daquela funcionalidade que está trabalhando.

O rebase interativo permite que você altere e reescreva a história do seu projeto ou daquela funcionalidade específica que você está trabalhando.

Para fazer um git rebase interativo, você pode executar o seguinte comando:

git rebase -i

Quais são os perigos ao usar o Git rebase?

Talvez você esteja ouvindo falar sobre o git rebase pela primeira vez e não o vê com frequência nem em conteúdos sobre git e também dificilmente verá alguém utilizando-o com frequência.

E não é só porque esse comando já é mais avançado. Na realidade, ele é tido como um comando bem perigoso. É evidente que, se você o dominar, ele poderá facilitar muito a sua vida.

Isso porque utilizando tal comando, você estará reescrevendo toda a história de commits da branch, ou seja, se você estiver trabalhando com outra pessoa, você precisa alinhar isso com ela para que vocês fiquem na mesma página.

Mas, se você estiver trabalhando com muitas pessoas, utilizar esse comando pode ser um tiro no pé, mesmo que todos estejam cientes e alinhados sobre. Portanto, é altamente recomendado que não utilize o git rebase em branch públicos, pois é possível destruir o histórico da branch e causar muitos problemas.

Mas de todo modo, é um comando que existe e para quem o domina é de suma relevância. Então, antes de descartar a hipótese de utilizá-lo, treine bastante esse comando, entenda todo o seu funcionamento e riscos e veja em quais momentos compensa utilizá-lo ou utilizar o git merge.

Opções para usar com Git rebase e fazer o rebase

Quase nada se faz sozinho e o git rebase tem os seus parceiros. Então, vamos ver quais comandos podemos utilizar juntamente ao git rebase. Também sabemos que a melhor forma de se aprender algo é colocando tudo em prática, portanto, aqui vai alguns comandos que você pode utilizar para treinar o rebase.

  • Git checkout -b nomebranch

Ao criar um repositório no GitHub e vincular com algum projeto, crie uma branch para si com o comando fornecido acima.

  • Git commit -m “Escreva um comentário”

Comece fazendo alguns commits na branch que você criou acima. Para isso, basta executar esse comando.

  • Git checkout main

Para que você consiga treinar o comando git rebase, você precisará inserir alguns commits na branch main para que a branch que você criou lá em cima não fique desatualizada em relação à branch principal. Para isso, basta utilizar esse comando e novamente fazer alguns commits nela.

  • Git log

Você pode utilizar esse comando para rastrear as mudanças de histórico de commits.

  • Git status

Comando muito utilizado para verificar o status da sua branch. Também serve para verificar se ainda existem arquivos que não estão dentro da ramificação do git.

  • Git rebase –continue

Este comando diz ao git que você quer continuar com as alterações feitas.

  • Git rebase –skip

Esse comando permite que você pule alterações. E quando você quiser, envie seu repositório para a origem.

Configurações do Git rebase usando o Git config

O git config é um comando autoexplicativo. Ele serve para fazer configurações relacionadas ao git e também ajuda a configurar o rebase, com os comandos:

rebase.stat 

Esse comando nada mais é que um booleano, que por default é inicializado como false. Ele serve para mostrar o que mudou desde o último rebase.

rebase.autoSquash

Também é um valor booleano, porém, sua função é alterar o comportamento do autoSquash.

rebase.autoStash

Opção que o rebase fornece muito útil para fazer alterações locais. O stash será aplicado sempre que o rebase for concluído.

rebase.missingCommitsCheck

Pode ser utilizado para alterar os valores que modificam os valores de commits ausentes.

rebase.instructionFormat

Lembra o git log, porém, ele formatará a apresentação do rebase interativo.

rebase.backend

Comando back-end padrão para o rebase. Possui duas opções: a de alterar e mesclar.

rebase.abbreviateCommands

Também é um booleano que, se for definido como verdadeiro, fará com que os nomes fiquem abreviados na lista de tarefas. O padrão dele é false.

rebase.rescheduleFailedExec

Comando utilizado para reprogramar exec e comandos que falharam.

rebase.forkPoint

Também é um booleano que, se for definido como false, define a –no-fork-point por padrão.

sequence.editor

Por fim, temos o sequence.editor, que permite que editemos o arquivo rebase por meio do git rebase -i, comando que vimos mais acima.

É importante conhecermos as opções que uma ferramenta ou tecnologia nos fornece, pois muitas vezes, na correria do dia a dia, ficamos no modo robô e apenas executamos funções sem ao menos entendê-las.

Como vimos aqui, o git rebase é um comando mais avançado do git que possui alguns riscos e benefícios, sendo importante treinarmos antes de utilizarmos, pois seu mal uso pode acabar com uma branch.

Se você gostou deste conteúdo, não deixe de ver O que é git e sua diferença com GitHub.