Sinopsis
git merge [--no-ff] [--squash] [--abort] [-s <strategy>] [<branch>]
Descripción
El comando git merge integra cambios de un branch en otro. Por defecto produce un commit de "merge real" con dos padres, preservando la topología de ambos historiales. Si el branch destino es ancestro estricto del fuente, Git hace fast-forward simplemente moviendo el puntero del branch; pasa --no-ff para registrar siempre un merge commit.
Cuando se cambian las mismas líneas en ambos lados, Git pausa con un marcador de conflicto. Resuelves manualmente, luego haces git add de los archivos y ejecutas git commit (o git merge --continue). Para abortar un merge en progreso, usa git merge --abort.
En el uso diario, git merge se integra con alias de shell, plugins de editor e integración continua. Para depurar, ejecuta con GIT_TRACE=1 para revelar las llamadas plumbing subyacentes.
Entender cómo git merge interactúa con el resto del modelo de datos de Git rinde dividendos al predecir resultados y recuperarse de errores.
Opciones comunes
| Opción | Descripción |
|---|---|
--no-ff | Siempre crea un merge commit, incluso cuando es posible fast-forward. |
--ff-only | Rechaza el merge a menos que sea posible fast-forward. |
--squash | Combina el historial mergeado en un único commit en el branch destino. |
--abort | Abandona un merge en progreso. |
--continue | Reanuda un merge tras resolver conflictos. |
-s <strategy> | Elige estrategia de merge (ort, recursive, resolve, octopus). |
-X <option> | Pasa opción específica de estrategia (p.ej. ours, theirs). |
--no-commit | Stagea el resultado del merge pero no commitea. |
Ejemplos
git merge feature/login
# Mergea el branch feature en el branch actual
git merge --no-ff release/1.2
# Siempre hace un merge commit (preserva topología)
git merge --abort
# Cancela un merge tras surgir conflictos
git merge -X theirs hotfix
# Auto-resuelve conflictos prefiriendo el lado "their"
Errores comunes
Resolver conflictos a las prisas y olvidar quitar los marcadores de conflicto (<<<<<<<) deja código roto commiteado. Siempre ejecuta un build o tests tras resolver. Otra trampa es hacer fast-forward silenciosamente cuando querías un merge commit para trazabilidad: usa --no-ff. Finalmente, --squash NO crea un merge commit, así que el branch fuente no se registra como padre.
Comandos relacionados
git rebase, git mergetool, git pull, git cherry-pick