Situación típica:
feature-branchmain avanza (los compañeros hacen push)main2 estrategias posibles:
mkdir demo-merge && cd demo-merge && git init
# Base común
echo "print('app v1')" > app.py
git add . && git commit -m "Versión inicial"
# Rama 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 avanza mientras tanto
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
|/
* Versión inicialHistorial: muestra con claridad que hubo 2 líneas de desarrollo en paralelo.
mkdir demo-rebase && cd demo-rebase && git init
# La misma preparación que antes...
echo "print('app v1')" > app.py
git add . && git commit -m "Versión 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 # "Desplaza" tus commits después de main
git checkout main
git merge feature-login # Fast-forward merge* Improve login
* Add login
* Update main app
* Versión inicialHistorial: lineal, como si hubieras desarrollado después de las actualizaciones de main.
| Aspecto | MERGE | REBASE |
|---|---|---|
| Historial | Muestra ramas en paralelo | Lineal, limpio |
| Commit de merge | Sí, se crea automáticamente | No, fast-forward |
| Complejidad | Simple | Más compleja |
| Conflictos | Resolverlos 1 vez | Puede que varias veces |
| Trazabilidad | Se ve cuándo se creó/fusionó la feature | Como si se hubiera desarrollado en secuencia |
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 "desplazados")Comando:
git checkout main
git merge feature-branchComando:
git checkout feature-branch
git rebase main
git checkout main
git merge feature-branch # Fast-forward¡NUNCA hagas rebase de commits ya compartidos o enviados con push!
Las dos funcionan. Lo importante = la coherencia en el equipo.