Diferenças entre git merge e git rebase

3 min

image

Git Merge

  • Operação: git merge develop
  • Objetivo: integrar as modificações de uma branch (develop) noutra (feature/login).
  • Processo: o Git cria um novo « commit de fusão » que tem dois pais, um para o último commit de cada branch. Isto preserva o histórico tal como ocorreu.
  • Resultado: o histórico da branch feature/login mostra uma estrutura com uma bifurcação, onde o commit de fusão combina os históricos das duas branches.

Git Rebase

  • Operação: git rebase develop
  • Objetivo: aplicar de novo os commits no cimo de outra branch de base.
  • Processo: rebasar toma as modificações feitas na branch feature/login e reaplica-as no cimo da branch develop.
  • Resultado: isto torna o histórico linear, como se as modificações tivessem sido feitas logo a seguir às últimas modificações em develop.

Diferenças-chave

  • Preservação do histórico: o merge não modifica o histórico existente, enquanto o rebase reescreve o histórico dos commits para o tornar linear.
  • Resolução de conflitos: com merge, os conflitos resolvem-se no fim do processo de fusão; o rebase pode exigir resolver conflitos ao longo do processo, à medida que cada commit é reaplicado.

Em resumo, merge usa-se para conservar um histórico preciso das alterações, enquanto rebase é preferido para simplificar o histórico antes da integração de uma branch de funcionalidades.

2 - Ainda não está claro?

Git Merge

  • O que faz: funde as alterações de duas branches numa só. Combina os caminhos de desenvolvimento.
  • Como funciona: cria um novo commit que tem dois pais. Cada pai representa o último commit de cada branch antes da fusão.
  • Histórico dos commits: o histórico mostra claramente quando as branches divergiram e se fundiram. Parece um gráfico com um ponto em que duas linhas se juntam para formar uma só.

Git Rebase

  • O que faz: muda a base da sua branch de funcionalidades para que apareça como se tivesse sido criada a partir do último commit da branch develop.
  • Como funciona: toma os commits da branch de funcionalidades e « reproduz-nos » um a um no cimo da branch develop.
  • Histórico dos commits: o histórico torna-se linear. Não se vê uma bifurcação como com merge. Dá a impressão de que todas as alterações foram feitas por ordem, sem desenvolvimento em paralelo.

Por que escolher um ou o outro?

  • Merge: usado para preservar o histórico completo e explícito do projeto. É útil quando quer ver os pontos precisos em que as alterações foram combinadas.
  • Rebase: usado para criar um histórico mais limpo e mais simples. É prático se quiser que o histórico pareça ter uma sequência de desenvolvimento direta, sem branches secundárias.

Em suma, se quiser que o histórico do projeto mostre como as funcionalidades foram desenvolvidas em paralelo e combinadas, use merge. Se preferir que o histórico seja simples e direto (como se tudo tivesse sido desenvolvido numa ordem linear), use rebase.