Tema 15: Merge automático entre ramas divergentes
En un fast-forward solo avanzaba una línea. Si main y feature/saludo han creado commits diferentes desde su punto de separación, los historiales han divergido. Para integrarlos, Git compara tres versiones: la base común, nuestra versión actual y la versión de la otra rama.
Si los cambios son compatibles, Git puede combinarlos automáticamente. Esto puede ocurrir incluso cuando ambas ramas han modificado el mismo archivo: por ejemplo, una cambia el título y la otra el pie en líneas distintas. Que coincida el archivo no significa por sí solo que exista un conflicto.
El resultado normal es un commit de merge con dos padres. El primer padre es la posición que tenía la rama actual; el segundo es la punta que integras. Ambos caminos quedan representados en el historial. La referencia HEAD^2, usando la notación del tema 6, selecciona el segundo padre de ese commit.
git merge --no-ff feature/saludo solicita conservar un commit de merge incluso cuando podría hacerse un avance directo. Sin esa opción, git merge feature/saludo elige avance directo si es posible y merge si hace falta. No confundas --no-ff con evitar todos los conflictos.
git log --oneline --graph --all --decorate ayuda a verlo: --graph dibuja conexiones, --all incluye las referencias de todas las ramas y --decorate muestra nombres asociados. El grafo local ilustra el mismo concepto. Una combinación automática debe revisarse: compatible para Git no significa necesariamente correcta para la aplicación.
Comandos para probar #
1git switch main 2git merge feature/saludo 3git log --oneline --graph --all --decorate 4git diff HEAD^1 HEAD
Error que conviene evitar #
Dar por correcto el programa porque el merge fue automático. Revisa el contenido combinado y realiza sus comprobaciones funcionales.
Laboratorio local #
Prueba los comandos y observa qué cambia. Puedes reiniciar sin guardar una entrega. Los retos evaluables y el cuestionario están en las actividades de este tema.
Git / práctica local
Dos cambios compatibles
Aplicar edición cambia el archivo; git add lo prepara.
Historial de commits
Las líneas conectan los commits con sus padres. Los commits que ya no tienen una referencia también permanecen visibles en este laboratorio.
- 0000004: Actualiza título; HEAD → main
- 0000003: Añade pie; feature/saludo
- 0000002: Prepara documento;
- 0000001: Commit inicial;
Comparar trabajo, índice y HEAD
Trabajo
Título de main Centro Pie inicial
Índice (staging)
Título de main Centro Pie inicial
HEAD
Título de main Centro Pie inicial
TERMINAL
Sesión local preparada. Escribe help para consultar los comandos de este tema.
Comandos disponibles y límites
git --version · git config --global <clave> [valor] git init · git status git add <archivo | .> · git commit -m "mensaje" · git log git log --oneline · git switch <rama> (antes: checkout) git restore [--staged] <archivo> · git commit --amend [-m "mensaje" | --no-edit] git switch --detach <commit> · HEAD · HEAD~1 git diff [--staged | <commit> <commit>] git remote [-v] · git remote add <nombre> <URL> · git remote get-url <nombre> · git remote set-url <nombre> <URL> git clone <URL> git push [-u] <remoto> <rama> ssh-keygen -t ed25519 · ssh -T git@github.com (ficticios) git branch [nombre] · git branch -m <nombre> · git branch -d <rama> · git switch -c <rama> git merge [--ff-only] <rama> git merge --no-ff <rama> · git log --graph --all --decorate help · clear
Sesión en memoria: recargar descarta la práctica. Doscientas acciones como máximo. Dos archivos editables de hasta 250 líneas. Diez ramas como máximo. El modelo no ejecuta comandos reales ni realiza conexiones externas. diff muestra contenido anterior y posterior por archivo.
Resumen
- La comparación tiene en cuenta el punto desde el que nacieron los cambios.
- Representan los dos caminos integrados.
- Solicita un commit de merge cuando haya trabajo que integrar.
- Dar por correcto el programa porque el merge fue automático. Revisa el contenido combinado y realiza sus comprobaciones funcionales.