← Git

Ramas

¿Por qué ocurren los conflictos y cómo los resuelves?

Ver respuesta — intenta responderla en voz alta primero

Un conflicto ocurre cuando dos ramas modifican las mismas líneas de un archivo (o una borra un archivo que la otra edita) y Git no puede decidir cuál versión conservar. Se resuelve abriendo el archivo, eligiendo qué código queda entre los marcadores <<<<<<<, ======= y >>>>>>>, borrando esos marcadores, y luego git add del archivo y terminando el merge con git commit.

Git fusiona automáticamente cuando los cambios están en zonas distintas. Pero si dos ramas cambiaron la misma línea de forma diferente, Git no adivina cuál quieres: te pide que decidas tú. Eso es un conflicto. No es un error, es una decisión pendiente.

Git marca la zona en conflicto así dentro del archivo:

<<<<<<< HEAD
código de tu rama actual
=======
código de la rama que estás mergeando
>>>>>>> feature

Tu trabajo: dejar el archivo como debe quedar (una versión, la otra, o una mezcla), borrar los tres marcadores, guardar, git add y confirmar.

# Intentas mergear y aparece un conflicto
git merge feature
# CONFLICT (content): Merge conflict in index.html
# Automatic merge failed; fix conflicts and then commit the result.

# Ver qué archivos están en conflicto
git status
# both modified: index.html

# Abres index.html y verás algo así:
# <<<<<<< HEAD
# <h1>Bienvenido</h1>
# =======
# <h1>Hola</h1>
# >>>>>>> feature

# Editas para dejar la versión correcta y borras los marcadores.
# Luego marcas el archivo como resuelto:
git add index.html

# Terminas el merge con un commit
git commit
# (Git ya trae un mensaje de merge por defecto)

# Si te arrepientes y quieres cancelar el merge por completo:
git merge --abort

Dejar los marcadores <<<<<<<, ======= o >>>>>>> sin borrar y commitear así, lo que rompe el archivo. Otro error es entrar en pánico y borrar todo; en su lugar, conviene mirar con calma qué aporta cada versión. Y si te bloqueas, siempre puedes cancelar con git merge --abort y volver al estado anterior al merge.

"Un conflicto pasa cuando dos ramas cambian las mismas líneas de un archivo y Git no puede decidir cuál conservar. No es un error, es una decisión que me toca a mí. Hago git status para ver los archivos en conflicto, los abro, busco los marcadores <<<<<<<, ======= y >>>>>>>, dejo el código correcto, borro los marcadores, y hago git add del archivo resuelto y git commit para cerrar el merge. Si me lío, cancelo todo con git merge --abort."

Reto rápido

Resolviste el conflicto en index.html editando el contenido, pero olvidaste borrar la línea =======. Haces git add y git commit. ¿Qué pasa?

Ver respuesta

El merge se completa, pero el archivo queda roto: el commit incluye la línea ======= (y probablemente <<<<<<< y >>>>>>>) como texto literal dentro del código. Git no valida que hayas borrado los marcadores; confía en que dejaste el archivo correcto. Habría que hacer otro commit corrigiendo el archivo. Por eso siempre hay que revisar bien antes de hacer git add.