Merge vs Rebase - Guia Decisional

3 min

Índice

  1. O dilema
  2. Merge explicado
  3. Rebase explicado
  4. Quadro comparativo
  5. Guia de decisão

1. O dilema

Desenvolve numa branch. Main avançou. Como integrar?

    A---B---C main
   /
  D---E feature-branch

2 opções:

  • MERGE: fundir com um commit de merge
  • REBASE: « deslocar » os seus commits depois de main

Qual escolher? Depende do seu objetivo!

Voltar ao índice

2. Merge explicado

Comando:

bash
git checkout main
git merge feature-branch

Resultado visual:

    A---B---C-------M main
   /               /
  D---E-----------/  (M = merge commit)

O que acontece:

  1. O Git cria um novo commit (M)
  2. Este commit combina as alterações das 2 branches
  3. O histórico mostra que houve 2 linhas de desenvolvimento

Vantagens:

  • Histórico verídico: vê-se que houve 2 desenvolvimentos em paralelo
  • Simples: um só comando, uma só resolução de conflito
  • Seguro: nunca altera os commits existentes
  • Padrão: abordagem por omissão na maior parte das equipas

Inconvenientes:

  • Histórico complexo: muitos merge commits
  • Menos legível: difícil seguir a evolução linear

Voltar ao índice

3. Rebase explicado

Comando:

bash
git checkout feature-branch
git rebase main

Resultado visual:

    A---B---C---D'---E' main

O que acontece:

  1. O Git « destaca » os seus commits D e E
  2. « Reproduz-nos » depois do commit C
  3. Cria novos commits D' e E' (as mesmas alterações, novos hashes)
  4. O histórico torna-se linear

Vantagens:

  • Histórico limpo: linha reta, fácil de ler
  • Fast-forward merge: sem commit de merge
  • Story-like: como se tivesse desenvolvido depois de main

Inconvenientes:

  • Reescreve o histórico: D e E tornam-se D' e E'
  • Mais complexo: várias resoluções de conflito possíveis
  • Perigoso: nunca rebase commits partilhados!

Voltar ao índice

4. Quadro comparativo

CritérioMERGEREBASE
HistóricoConserva branches paralelasLineariza tudo
CommitsAcrescenta commit de mergeReescreve os commits
ComplexidadeSimples (1 comando)Mais complexa
Conflitos1 resolução no máximoVárias resoluções possíveis
SegurançaMuito seguroPerigoso se mal usado
RastreabilidadeVê quando as branches foram criadas/fundidasPerde informação temporal
ColaboraçãoPerfeito em equipaAtenção aos commits partilhados
LegibilidadeComplexa com muitas branchesMuito clara, linear

Voltar ao índice

5. Guia de decisão

Use MERGE quando:

Situações:

  • Está a começar com Git
  • Trabalha em equipa
  • Quer manter o histórico « verdadeiro »
  • Quer a solução mais segura
  • Funde branches de longa duração

Comandos:

bash
git checkout main
git pull origin main
git merge feature-branch
git push origin main

Use REBASE quando:

Situações:

  • Quer um histórico limpo e linear
  • A sua branch é curta e pessoal
  • Ainda não partilhou os seus commits
  • A sua equipa prefere o histórico linear
  • Domina bem o Git

Comandos:

bash
git checkout feature-branch
git rebase main               # Resolver conflitos se necessário
  git checkout main
git merge feature-branch      # Fast-forward merge
  git push origin main
  ```

### **REGRA DE OURO:**

**NEVER REBASE SHARED COMMITS!**

```bash
# PERIGO - NUNCA faça isto:
git push origin feature-branch    # Commits partilhados
git rebase main                   # Reescreve commits partilhados = CAOS na equipa

# OK - Rebase apenas local:
git rebase main                   # Commits ainda locais = OK
git push origin feature-branch    # Push depois do rebase = OK

Recomendação por nível:

NívelEstratégia recomendada
PrincipianteSempre MERGE
IntermédioMERGE para colaboração, REBASE para limpeza local
PeritoA equipa decide uma estratégia coerente

Estratégias de equipa populares:

  1. « Merge only »: simples, seguro, histórico completo
  2. « Rebase then merge »: rebase local + merge em main
  3. « Squash merge »: 1 commit por feature (estilo GitHub)

O importante = coerência na equipa, não a perfeição técnica!

Voltar ao índice