🔀 Ramas, Fusión y Manejo de Conflictos en Git

Cuando varios desarrolladores trabajan en paralelo sobre el mismo proyecto, las líneas de código divergen inevitablemente. Aprender a ramificar, fusionar y resolver los conflictos resultantes con precisión técnica es una habilidad imprescindible.

En esta lección aprenderás:

  1. Cómo crear, cambiar y aislar trabajo en ramas con git branch y git switch.
  2. Cómo integrar historias con git merge (fast-forward vs merge commit).
  3. Qué es exactamente un conflicto de integración y por qué ocurre.
  4. Cómo interpretar los marcadores de conflicto (<<<<<<<, =======, >>>>>>>).
  5. El procedimiento paso a paso para resolver conflictos, testear y cerrar la fusión de forma limpia.

🌿 FUSIONAR RAMAS (MERGE) — EXPLICADO DESPACIO

🧠 Idea clave (primero la idea, luego los comandos)

Imagina esto:

  • Rama main → versión estable del proyecto
  • Rama login → estás trabajando una nueva función

👉 Fusionar (merge) significa:

Traer los cambios de una rama a otra

Normalmente:

  • Trabajas en una rama secundaria
  • Fusionas esa rama en main

📊 Ejemplo visual de bifurcación y merge

Bifurcación de ramas, integración con git merge y marcadores de conflicto main login A B C Cambio en línea 2 D E Cambio distinto en línea 2 F Merge Commit <<<<<<< HEAD (versión en main) ======= (separador) >>>>>>> login (versión entrante) ¡Conflicto! Misma línea modificada
Evolución de un merge con ramas divergentes: la rama login bifurca desde B y avanza en paralelo a main. Si ambas modifican las mismas líneas, Git inserta marcadores de conflicto antes de sellar el merge commit F.

🧪 EJEMPLO REAL PASO A PASO (sin conflictos)

Paso 1️⃣ Crear proyecto

# Inicializar repositorio de prueba
git init

Crear archivo:

mensaje.txt
Hola mundo
# Preparar y crear el commit inicial en main
git add .
git commit -m "chore: mensaje inicial"

Paso 2️⃣ Crear una rama nueva

# Crear la rama secundaria y saltar a ella
git checkout -b login

📌 Ahora estás en la rama login.


Paso 3️⃣ Cambiar algo en la rama nueva

Editar mensaje.txt:

Hola mundo
Agregando pantalla de login

Guardar:

# Confirmar el cambio en la rama login
git add .
git commit -m "feat: agrego pantalla de login"

Paso 4️⃣ Volver a main

# Volver a la rama principal (los archivos se restauran a su estado en main)
git checkout main

📌 OJO: el archivo vuelve a su versión original en main.


Paso 5️⃣ Fusionar la rama login

# Traer e integrar los cambios de login en main
git merge login

🎉 Merge exitoso sin conflictos (Fast-Forward o auto-merge limpio)


⚠️ AHORA: CONFLICTOS (lo importante)

🧠 ¿Cuándo hay conflictos?

Hay conflicto cuando:

  • Dos ramas
  • Cambian la misma línea
  • De forma diferente

Git no sabe cuál elegir 🤯


💥 EJEMPLO REAL DE CONFLICTO

Paso 1️⃣ Estado inicial

Archivo mensaje.txt en main:

Hola mundo

Paso 2️⃣ Rama login cambia el archivo

# Crear la rama de trabajo para la función
git checkout -b login
Hola mundo desde login
# Preparar y confirmar la línea modificada en la rama login
git add .
git commit -m "feat: cambio texto en login"

Paso 3️⃣ Volver a main y cambiar lo mismo

# Regresar a la rama main
git checkout main
Hola mundo desde main
# Modificar la misma línea con otro contenido y confirmar en main
git add .
git commit -m "feat: cambio texto en main"

Paso 4️⃣ Intentar fusionar (BOOM 💥)

# Intentar integrar la rama login en main (aquí Git detecta la colisión)
git merge login

Git responde:

CONFLICT (content): Merge conflict in mensaje.txt
Automatic merge failed; fix conflicts and then commit the result.

🔍 QUÉ ES UN CONFLICTO (POR DENTRO)

Abres mensaje.txt y ves:

<<<<<<< HEAD
Hola mundo desde main
=======
Hola mundo desde login
>>>>>>> login

¿Qué significa esto?

  • <<<<<<< HEAD → lo que está en tu rama actual (main)
  • ======= → separador
  • >>>>>>> login → lo que viene de la otra rama

🛠️ CÓMO RESOLVER EL CONFLICTO (PASO A PASO)

Paso 1️⃣ Decidir qué queda

Opción A: quedarte con main:

Hola mundo desde main

Opción B: quedarte con login:

Hola mundo desde login

Opción C: combinar:

Hola mundo desde main y login

👉 Tú decides.


Paso 2️⃣ Borrar los marcadores

⚠️ MUY IMPORTANTE Debes borrar:

<<<<<<<
=======
>>>>>>>

Paso 3️⃣ Guardar el archivo

El archivo debe quedar limpio:

Hola mundo desde main y login

Paso 4️⃣ Marcar como resuelto

# Informar a Git que el conflicto en este archivo ya fue resuelto
git add mensaje.txt

Paso 5️⃣ Crear el commit de resolución

# Crear el commit final de merge que sella la resolución del conflicto
git commit -m "merge: resuelvo conflicto entre main y login"

🎉 Conflicto resuelto correctamente.


🔄 Flujo COMPLETO de merge con conflicto

# 1. Intentar la fusión de la rama
git merge login

# 2. Git reporta CONFLICT (content)
# 3. Abrir los archivos afectados en tu editor y resolver los marcadores

# 4. Marcar los archivos resueltos
git add .

# 5. Confirmar el commit de merge
git commit -m "merge: resuelvo conflicto"

🧠 Consejos profesionales

✔️ Haz git pull antes de trabajar ✔️ Haz commits pequeños ✔️ Usa ramas para TODO ✔️ Lee el conflicto con calma ✔️ Git NUNCA borra tu trabajo


❌ Errores comunes

❌ Borrar el archivo completo ❌ Hacer commit sin resolver ❌ Asustarse y cerrar todo 😅


🧠 RESUMEN FINAL

Merge sin conflicto

git checkout main
git merge rama

Merge con conflicto

  1. Git avisa
  2. Editas archivo
  3. Borras marcadores
  4. git add
  5. git commit