Situação típica:
feature-branchmain avança (colegas fazem push)main2 estratégias possíveis:
mkdir demo-merge && cd demo-merge && git init
# Base comum
echo "print('app v1')" > app.py
git add . && git commit -m "Versão inicial"
# Branch feature
git checkout -b feature-login
echo "print('login system')" > login.py
git add . && git commit -m "Add login"
echo "print('login v2')" > login.py
git add . && git commit -m "Improve login"
# Main avança entretanto
git checkout main
echo "print('app v1.1')" > app.py
git add . && git commit -m "Update main app"git merge feature-login* Merge branch 'feature-login'
|\
| * Improve login
| * Add login
* | Update main app
|/
* Version initialeHistórico: mostra claramente que houve 2 linhas de desenvolvimento em paralelo.
mkdir demo-rebase && cd demo-rebase && git init
# O mesmo setup de antes...
echo "print('app v1')" > app.py
git add . && git commit -m "Versão inicial"
git checkout -b feature-login
echo "print('login system')" > login.py
git add . && git commit -m "Add login"
echo "print('login v2')" > login.py
git add . && git commit -m "Improve login"
git checkout main
echo "print('app v1.1')" > app.py
git add . && git commit -m "Update main app"git checkout feature-login
git rebase main # "Desloca" os seus commits depois de main
git checkout main
git merge feature-login # Fast-forward merge* Improve login
* Add login
* Update main app
* Version initialeHistórico: linear, como se tivesse desenvolvido depois das atualizações de main.
| Aspeto | MERGE | REBASE |
|---|---|---|
| Histórico | Mostra branches paralelas | Linear, limpo |
| Commit de merge | Sim, criado automaticamente | Não, fast-forward |
| Complexidade | Simples | Mais complexa |
| Conflitos | Resolver 1 vez | Talvez várias vezes |
| Rastreabilidade | Vê quando a feature foi criada/fundida | Como se tivesse sido desenvolvido sequencialmente |
MERGE:
A---B---C main
/ \
D---E---F---G feature (merge commit G)REBASE:
A---B---C---D'---E'---F' main (commits D,E,F "deslocados")Comando:
git checkout main
git merge feature-branchComando:
git checkout feature-branch
git rebase main
git checkout main
git merge feature-branch # Fast-forwardNUNCA rebase commits já partilhados/enviados!
Os dois funcionam. O importante = coerência na equipa!