Un manual paso a paso para resolver conflictos de merge o rebase de forma segura. Ejecuta los pasos en orden -- saltarse adelante es cómo se pierden los árboles de trabajo limpios. Cada paso tiene una salida de emergencia (--abort) así que puedes retroceder en cualquier momento hasta el commit final.
Si algo está staged o modificado, haz commit, stash o descárdalo. Nunca inicies un merge con un árbol sucio -- los conflictos mezclarán tu trabajo en progreso con la resolución del merge y no podrás diferenciarlos.
# Haz stash si quieres guardar trabajo en progresogit stash push -u -m "wip before merging main"
Un conflicto resuelto contra un main anticuado es trabajo desperdiciado -- los conflictos reales aún están adelante. --ff-only rechaza hacer merge silenciosamente si tu rama ha divergido.
git rev-parse HEAD# escribe este SHA en algún lugar -- una nota adhesiva, un archivo temporal, donde sea
Si todo sale mal, git reset --hard <that-sha> te pone de vuelta exactamente donde empezaste. git reflog también funciona, pero un SHA escrito es más rápido bajo estrés.
Git imprime exactamente qué archivos tienen conflicto y qué tipo de conflicto es cada uno (contenido vs. add/add vs. delete/modify). Lee esta lista. No inicies a abrir archivos hasta que sepas cuántos conflictos tienes y dónde están.
git status# Busca "Unmerged paths" -- esa es tu lista de trabajo
# Obtén una lista limpia solo de archivos en conflictogit diff --name-only --diff-filter=U
<<<<<<< HEAD
tu versión (la rama en la que estás haciendo merge)
=======
su versión (la rama de la que estás haciendo merge)
>>>>>>> main
Durante un rebase, las etiquetas se invierten: HEAD es la rama base a la que estás rebaseando, y el lado >>>>>>> es tu commit entrante. Esto sorprende a todos al menos una vez.
# Muestra el diff completo con ambos ladosgit diff# O para un archivo específicogit diff -- path/to/file.ts# Mira quién escribió cada lado y por quégit log --merge --oneline -- path/to/file.tsgit log -p HEAD..MERGE_HEAD -- path/to/file.ts
Saber por qué cada lado hizo un cambio -- no solo qué cambió -- es la diferencia entre una resolución real y una adivinanza que compila.
Para un rebase, git add NO progresa automáticamente -- aún necesitas el paso 16. Para un merge, stagear todos los conflictos te deja listo para hacer commit.
Repite los pasos 8-13 para cada archivo en git status.
# Para un merge: ¿qué contendrá el commit de merge?git diff HEAD# Para un rebase: ¿cómo difiere mi rama de antes?git range-diff <starting-sha>..ORIG_HEAD <starting-sha>..HEAD
Si el diff tiene archivos que no tocaste o no esperas, algo salió mal. Detente e investiga antes de hacer commit.
# Merge: commit el merge con el mensaje auto-generado (o escribe el tuyo)git commit# Rebase: debería estar ya hecho después del --continue final
Para un commit de merge, escribe un cuerpo que explique cuáles fueron los conflictos y cómo los resolviste. El tú futuro te lo agradecerá durante un bisect.
# Merge: push regular está biengit push# Rebase: force-push, pero SOLO a tus propias ramas y SOLO con --force-with-leasegit push --force-with-lease
--force-with-lease rechaza el push si alguien más hizo commit a la rama remota desde tu última fetch -- es la diferencia entre reescribir tu propio historial y sobrescribir el commit de un compañero. Nunca --force (sin -with-lease) en una rama compartida.
Resolviendo conflictos en una base anticuada. Siempre haz pull de main primero (paso 3). Resolver contra el main de la semana pasada significa hacer el trabajo dos veces.
Mezclando tu trabajo en progreso en la resolución. Un árbol sucio al inicio de un merge es un bug garantizado. Haz stash primero (paso 1).
Confundiendo "ours" y "theirs" durante un rebase. Se invierten. Cuando tengas dudas, mira git log para confirmar qué commit es cuál.
Haciendo commit con marcadores aún en el archivo. Siempre busca <<<<<<< antes de stagear.
Haciendo force-push de una rama compartida. Usa --force-with-lease, y nunca en main.
Revisado por Chris St. John·Última actualización: 7 jul 2026