Divergência de branchs | Mesclagem | Git
- Divergência de branchs | Mesclagem | Git
🧩 1. git config pull.rebase false → MERGE (padrão do Git)
-
O que faz: O Git faz um merge entre o que está no remoto e o que você tem localmente. Cria um novo commit de merge que junta as duas linhas de histórico.
-
Exemplo visual:
Antes:
Local: A - B
Remoto: A - C
Depois do pull (merge):
\
A - B ---- M
\--- CO commit
Mé o merge commit que une tudo. -
Vantagem: preserva o histórico exatamente como aconteceu.
-
Desvantagem: o histórico pode ficar cheio de commits de merge, meio “poluído”.
🧩 2. git config pull.rebase true → REBASE
-
O que faz: O Git “pega” seus commits locais e os reaplica por cima dos commits novos do remoto. É como se você tivesse feito seus commits depois dos commits do servidor.
-
Exemplo visual:
Antes:
Local: A - B
Remoto: A - C
Depois do pull (rebase):
A - C - B'(O
B'é seu commit reescrito, com novo hash.) -
Vantagem: histórico linear, limpo e fácil de entender.
-
Desvantagem: reescreve commits (não é bom se outras pessoas já baixaram sua versão antiga).
🧩 3. git config pull.ff only → FAST-FORWARD ONLY
-
O que faz: O Git só puxa (pull) se for possível avançar o ponteiro da branch sem precisar mesclar nada. Ou seja: só funciona se você não tiver feito commits locais ainda.
-
Exemplo visual:
Antes:
Local: A
Remoto: A - B - C
Depois do pull:
Local: A - B - C -
Vantagem: histórico totalmente linear, sem merges nem rebase.
-
Desvantagem: se você tiver commits locais, o pull vai falhar.
git merge --no-ff e git rebase
🧩 1. git merge --no-ff
👉 Faz uma mesclagem (merge) explícita.
- Esse comando cria um novo commit de merge, mesmo que fosse possível fazer fast-forward.
- “no-ff” significa “no fast-forward”.
🔍 Exemplo visual:
Antes:
Local: A - B
Remoto: A - C
Depois de:
git merge --no-ff origin/main
Resultado:
A - B ---- M
\--- C
O commit M é o merge commit, unindo os dois históricos.
🟢 Use quando quiser manter o histórico completo, mostrando claramente onde houve uma junção.
🧩 2. git rebase
👉 Faz um rebase dos seus commits locais sobre o remoto.
- O rebase “reaplica” seus commits locais por cima do histórico remoto.
- Assim, o histórico fica linear, como se você tivesse feito seus commits depois dos commits do servidor.
🔍 Exemplo visual:
Antes:
Local: A - B
Remoto: A - C
Depois de:
git rebase origin/main
Resultado:
A - C - B'
(B’ é uma cópia reescrita do commit B.)
🟢 Use quando quiser um histórico limpo e linear, sem commits de merge.
⚙️ 3. (Opcional) Desativar o aviso
Se você já entendeu o aviso e não quer que o Git mostre isso toda hora, pode desativá-lo com:
git config --global advice.diverging false
Mas só faça isso se você realmente souber o que está fazendo — o aviso é útil para lembrar que há divergência.
🧭 Em resumo
| Ação | Comando | Resultado |
|---|---|---|
| Fazer merge explícito | git merge --no-ff | Mantém todo o histórico com commit de merge |
| Fazer rebase | git rebase | Reescreve histórico para ficar linear |
| Desativar aviso | git config advice.diverging false | Só esconde a mensagem, não resolve o problema |
Se quiser, posso te mostrar um exemplo prático de passo a passo:
1️⃣ criar dois commits diferentes em local e remoto,
2️⃣ e depois ver como fica com merge e com rebase.
💡 Dicas práticas
| Situação | Melhor opção | Comando sugerido |
|---|---|---|
| Você trabalha sozinho no repositório | rebase ou merge (tanto faz) | git config --global pull.rebase true |
| Você trabalha em equipe e quer histórico limpo | rebase | git config --global pull.rebase true |
| Você quer manter tudo exatamente como aconteceu | merge | git config --global pull.rebase false |
| Você nunca faz commits locais (só baixa) | ff only | git config --global pull.ff only |