Git | Rebase

Lilian Lima
Devs JavaGirl
Published in
4 min readJun 28, 2019
Git

Essa é a quinta publicação de uma série onde compartilho como as coisas acontecem nos bastidores do Git, além do comandos, conceitos.

O rebase é uma outra ferramenta disponível no Git para integrar mudanças ocorridas entre duas branches. Como vimos no 2o post da série, uma branch sempre é criada a partir de uma outra tendo como estado atual (ou o HEAD apontando para) o commit que está no topo da pilha de commits dessa branch original. Portanto, podemos dizer que a nova branch está baseada nessa branch original.
Suponha que você tenha criado a branch minha-feature (e eu desejo de todo coração que o gitflow da sua equipe esteja redondo) a partir da branch master e após essa criação alguns colegas de trabalho integraram suas mudanças na branch original, a master, e você deseja trazer essas últimas integrações para sua branch de trabalho, minha-feature. O cenário proposto seria algo semelhante a esse:

Qual ferramenta escolheria para realizar essa integração: merge ou rebase?

Só relembrando que o merge acrescentaria essas novas mudanças, empacotadas em objetos de commits, no topo da sua branch atual.

Quando você executar git rebase master, o Git irá atualizar a base da minha minha-feature para o estado mais atual da branch master, e o Git, muito eficiente que é, te informará sobre isso:

A mensagem é pequena, mas o número de movimentos realizados não. O HEAD que permanecia apontando para o último commit realizado na branch minha-feature, o f896543, irá retornar para o commit ancestral/pai/antecessor comum a ambas as branches, no caso o 2636536, e em seguida se moverá até o estado atual (ou o commit que está no topo da pilha) da branch master, 4e56341, que é o commit que quero como base “existencial “ para branch minha-feature.

Para ser mais exata o que o Git faz depois de mover o HEAD de volta para o commit ancestral comum das branches é armazenar partes de cada commit que você fez na branch (o diff das mudanças, o commit, o autor, etc.), depois faz um checkout do último commit realizado na branch original, no caso a master, e então aplica cada uma das mudanças armazenadas como um novo commit no topo da pilha da minha branch minha-feature, estado final da branch:

Rebase é uma ferramenta incrivelmente poderosa quando você está trabalhando em sua branch de trabalho específica que foi baseada numa branch compartilhada, por exemplo, a master.

Através do rebase você integra na sua branch de trabalho as mudanças que foram integradas por outros colegas na branch compartilhada (por ex.: master, development) e mantém uma timeline limpa que permitirá um merge fast-forward no momento em que for integrar suas mudanças com os demais. Manter a timeline limpa também torna a leitura ou a visualização (experimente git log -graph) dos logs de commit mais claros e coerentes com a realidade.

O tradeoff de reescrever a timeline da sua branch será tratado num outro post.

Conflitos podem ocorrer ao longo do rebase, tal como podem ocorrer durante o merge. Mas, diferentemente do merge você não precisa resolver isso gerando um commit extra, lembre-se: ao fazer um rebase um novo commit está sendo gerado contendo todas as diferenças encontradas e os conflitos que você resolveu ao longo do caminho. Simplesmente adicione as mudanças a Staging Area e então execute git rebase — continue.

Aqui você também pode interromper o rebase executando git rebase — abort. Ao fazer isso todas as integrações e diferenças aplicadas durante o rebase serão perdidas e a branch se manterá no mesmo estado que estava antes de tudo começar.

Respondendo a pergunta acima sobre qual ferramenta utilizar, no dia-a-dia você acaba usando as duas, o que determina é a direção da integração que se está fazendo, explico: se você está integrando na sua branch de trabalho específica as mudanças integradas na branch compartilhada então recomendo rebase; se estiver integrando na branch compartilhada as mudanças produzidas na sua branch de trabalho específica então recomendo merge, e torço para que seja um merge fast-foward. ;-)

Direção da integração

Referência:

https://dev.to/unseenwizzard/learn-git-concepts-not-commands-4gjc

--

--

Lilian Lima
Devs JavaGirl

{“ocupação”: “software engineer”, “idioma computacional”: “java”, “um hobby”:” escrever”,” um valor”:” justiça social”, “um amor”: “minha família 💙”}