Concrete Logo
Hamburger button

Git para Corajosos – Rebase (Parte 1)

  • Blog
  • 4 de Setembro de 2017

Este é o primeiro post de uma série 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ê começa 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 no 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:

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, se você quiser estudar mais:

Até a próxima!

Quer compartilhar conhecimento com a gente? Deixe seu currículo!