Desenvolvimento

5 out, 2017

Git para corajosos – Rebase – Parte 01

Publicidade

Este é o primeiro de uma série de artigos sobre coisas legais e perigosas que podemos fazer com Git.

Rebase versus Merge

O Rebase é um comando que tem uma reputação ruim. Com bastante frequência, ouço de outras pessoas que uma das primeiras lições que tiveram ao aprender Git, é que o Rebase é um comando proibido por ser muito perigoso. Mas o que muita gente não sabe é que o Rebase, quando dominado, pode ajudar muito a vida do desenvolvedor ou do DevOps.

Merge

Uma das coisas mais importantes sobre o Rebase, é que ele resolve o mesmo problema do Merge: ambos integram mudanças de um branch para outro, só que de maneira diferente.

Imagine que você comece trabalhando em uma nova feature de um branch e então outro membro do time atualiza o branch master. O que temos como resultado é um fork do histórico que é bem familiar para qualquer um que já usou o Git:

Agora, digamos que os novos commits no branch master são importantes para a feature na qual você está trabalhando. Para adicionar os novos commits no branch feature, você tem duas opções: Merge ou Rebase.

Fazendo o Merge

É a opção mais fácil. Podemos fazer o Merge do master em nosso branch com o comando:

git checkout feature
git merge master

O resultado é a criação de um commit do próprio Merge, unindo os históricos dos dois branches. Então temos agora uma estrutura parecida com esta:

O merge é interessante porque é uma operação não destrutiva. Os commits dos branches existentes não são alterados e isso evita alguns riscos do Rebase.

Por outro lado, também significa que o branch feature terá um um commit irrelevante todas as vezes que você precisar incorporar mudanças. Se o branch principal tem muita atividade, isso vai poluir bastante o branch no qual está trabalhando e isso gera impacto direto aos outros desenvolvedores, que não vão conseguir entender o histórico do projeto.

Rebase

Então, como alternativa ao Merge, você pode fazer o Rebase do branch feature no branch master, utilizando os comandos:

git checkout feature
git rebase master

Basicamente, o que o rebase faz é reproduzir, commit por commit, as ações que você desejar. No nosso caso, reproduzindo os novos commits de master no branch feature.

E se você não se sente confortável com o Git Rebase, você pode treinar o Rebase em um branch temporário. Assim, se você fizer besteira, você pode tentar de novo fazendo um checkout do branch original:

git checkout feature
git checkout -b temporary-branch
git rebase -i master
# [Clean up the history]
git checkout master
git merge temporary-branch

Depois do Rebase, o nosso histórico fica assim:

 

A Regra Áurea do Rebase

Agora que já entendemos basicamente o que é o rebase, precisamos falar da Regra Áurea:

“Nunca faça um rebase enquanto você está trabalhando em um branch público”.

O problema é que isso precisa ser combinado com as outras pessoas envolvidas no repositório. Lembre-se, com o rebase nós estamos reescrevendo a história, então é como uma conspiração: todos precisam estar dentro do esquema para tudo dar certo. E quanto mais pessoas envolvidas, mais difícil fica.

Por enquanto é isso, pessoal! Na parte 2 desta série vou falar um pouco mais de outras coisas que podemos fazer com o Git Rebase, usando o modo interativo.

Algumas referências, caso queira estudar mais:

Até a próxima!

***

Este artigo foi publicado originalmente em: https://www.concrete.com.br/2017/09/04/git-para-corajosos-rebase-parte-1/