🔀 Resolución de Conflictos en Git
Has estado trabajando tranquilo en tu rama, haciendo commits, cuando de repente intentas hacer un git merge o git pull y aparece algo así:
Auto-merging archivo.js
CONFLICT (content): Merge conflict in archivo.js
Automatic merge failed; fix conflicts and then commit the result.
¡Felicidades! Has encontrado tu primer conflicto de merge. No te preocupes, en esta lección aprenderás exactamente qué son, por qué ocurren y cómo resolverlos como un profesional.
Un conflicto de merge ocurre cuando Git no puede resolver automáticamente las diferencias entre dos ramas porque las mismas líneas de código fueron modificadas en ambas. Git necesita que tú decidas cuál versión mantener o cómo combinarlas.
¿Por Qué Ocurren los Conflictos?
Los conflictos son una consecuencia natural del trabajo colaborativo. Ocurren porque:
- Múltiples desarrolladores modifican el mismo archivo simultáneamente
- Alguien edita una función que tú también estás editando
- Se borran archivos en una rama y se modifican en otra
- Los cambios en diferentes ramas afectan las mismas líneas de código
Identificando un Conflicto
Cuando intentas hacer un merge y hay conflictos, Git te lo indica claramente:
- El comando
git mergeogit pullse detiene - Aparece el mensaje "CONFLICT" junto al archivo afectado
- El archivo conflictivo tendrá marcadores especiales en su contenido
- Puedes verificar todos los archivos en conflicto con
git status
Los Marcadores de Conflicto
Cuando abres un archivo con conflicto, verás algo como esto:
<<<<<<< HEAD
const nombre = "María";
=======
const nombre = "Carlos";
>>>>>>> rama-login
function saludar() {
console.log("Hola " + nombre);
}
Desglosemos estas secciones:
| Marcador | Significado |
|---|---|
<<<<<<< HEAD |
Indica el inicio del conflicto. Todo lo que sigue es tu rama actual (la que estás mergingando) |
======= |
Separador entre los dos cambios en conflicto |
>>>>>>> rama-login |
Indica el fin del conflicto y el nombre de la otra rama |
Resolviendo Conflictos Paso a Paso
Ahora viene la parte práctica. Aquí está el proceso completo para resolver conflictos:
Paso 1: Identificar Todos los Archivos en Conflicto
git status
# Verás algo como:
# Unmerged paths:
# both modified: src/app.js
# both modified: src/utils.js
Paso 2: Abrir los Archivos Afectados
Abre cada archivo en tu editor de código favorito. Verás los marcadores de conflicto que mostramos antes.
Paso 3: Decidir la Estrategia de Resolución
Tienes cuatro opciones para cada conflicto:
- Mantener solo tu versión (HEAD): Borra todo incluyendo los marcadores y los cambios de la otra rama
- Mantener solo la otra versión: Borra todo incluyendo los marcadores y tus cambios
- Combinar ambas versiones: Integra los cambios de ambas ramas de forma manual
- Escribir algo completamente nuevo: A veces la mejor solución es un código diferente a ambas versiones
Paso 4: Editar el Archivo
Elimina los marcadores de conflicto y deja únicamente el código que deseas:
# ANTES (con marcadores):
<<<<<<< HEAD
const nombre = "María";
=======
const nombre = "Carlos";
>>>>>>> rama-login
# DESPUÉS (resuelto):
const nombre = "María García"; // Combinamos: nombre + apellido
# O si decides usar la otra versión:
const nombre = "Carlos";
# O si combinas ambas:
const nombre = "María";
const segundoNombre = "Carlos";
Paso 5: Guardar y Marcar como Resuelto
Después de editar cada archivo:
git add src/app.js
# Si tienes varios archivos:
git add .
Paso 6: Completar el Merge
git commit -m "Merge rama-login: resuelvo conflictos en app.js"
# Si Git abrió el editor automáticamente, simplemente guarda y cierra
Usando Visual Studio Code para Resolver Conflictos
VS Code tiene herramientas integradas que hacen la resolución de conflictos mucho más fácil:
Funciones Útiles de VS Code:
- Resolución con un clic: El editor resalta en colores las diferencias y ofrece botones para aceptar cambios
- Vista lado a lado: Puedes ver ambas versiones simultáneamente
- Resaltado de sintaxis: El código dentro de los marcadores mantiene los colores
- GitLens y extensiones: Herramientas adicionales para gestión visual de conflictos
# En VS Code puedes:
# 1. Hacer clic en "Accept Current Change" → Usa tu versión
# 2. Hacer clic en "Accept Incoming Change" → Usa la otra versión
# 3. Hacer clic en "Accept Both Changes" → Mantiene las dos
# 4. Editar manualmente el código
Estrategias para Evitar Conflictos
| Estrategia | Descripción | Beneficio |
|---|---|---|
| Sincroniza frecuentemente | Haz git pull o git merge main regularmente en tu rama |
Resuelves conflictos pequeños en lugar de grandes |
| Comunica con tu equipo | Avisa cuando vayas a editar archivos importantes | Coordina quién modifica qué |
| Ramificaciones cortas | Mergear ramas pequeñas y frecuentes | Menos líneas en conflicto |
| Extraer lógica a funciones | Divide archivos grandes en módulos pequeños | Menos probabilidad de conflicto |
| Rebase en lugar de merge | Usa git rebase main en vez de fusionar ramas |
Historial lineal, conflictos en tu rama local |
Conflictos Durante un Rebase
Los conflictos también pueden ocurrir durante un git rebase. El proceso es similar, pero con una diferencia clave:
En un rebase, los commits se aplican uno por uno sobre la base nueva. Si hay un conflicto en el commit 3, debes resolverlo antes de continuar con el commit 4. Después de resolver, usas
git add y git rebase --continue.
# Durante un rebase con conflicto:
# 1. Resuelve el conflicto en el archivo
git add archivo-resuelto.js
# 2. Continúa con el siguiente commit
git rebase --continue
# Si quieres abortar todo el rebase:
git rebase --abort
# Si quieres saltarte este commit problemático:
git rebase --skip
Abortar un Merge Conflictivo
A veces simplemente quieres empezar de nuevo. Git te permite revertir un merge:
# Abortar el merge en curso
git merge --abort
# Esto revertirá todo al estado antes del merge
git status # Verás que estás de vuelta en tu rama original
Un buen desarrollador sabe cuándo resolver un conflicto y cuándo retroceder y replanificar. Abortar no es rendirse, es tomar una decisión inteligente.
Herramientas Avanzadas para Conflictos
Ver más: Herramientas externas de mergePara conflictos complejos, puedes usar herramientas dedicadas:
- KDiff3: Gratuita, muestra tres paneles (base, local, remoto)
- Beyond Compare: Potente, muy usada en industria
- Meld: Open source, interface simple
- P4Merge: De Perforce, gratuita para uso personal
Configúralas con:
git config --global merge.tool nombre-herramienta
git mergetool
Buenas Prácticas Post-Conflicto
- Prueba siempre el código: Ejecuta los tests después de resolver conflictos
- Revisa el código completo: Asegúrate de que la lógica tenga sentido
- Comunica a tu equipo: Si el conflicto involucraba código de otros, notifícales
- Documenta decisiones: En el mensaje de commit explica por qué elegiste cierta versión
- Haz push: Sube los cambios resueltos lo antes posible
# Ejemplo de buen mensaje de commit post-conflicto:
git commit -m "Merge feature/pagos: resuelvo conflicto en calculo.js
- Mantengo mi validación de email del frontend
- Agrego la función de sanitización de backend
- Resuelto conflicto con María sobre formato de fechas
Verifico: todos los tests pasan ✓"
Resumen Rápido
| Situación | Comando |
|---|---|
| Ver archivos en conflicto | git status |
| Ver diferencias | git diff |
| Marcar como resuelto | git add archivo.js |
| Completar merge | git commit |
| Abortar merge | git merge --abort |
| Continuar rebase | git rebase --continue |
| Herramienta visual | git mergetool |
¿Cuál es el orden correcto para resolver un conflicto de merge?
- A) Hacer git push, resolver conflicto, hacer git commit
- B) Ver los marcadores, editar el archivo, hacer git add, hacer git commit
- C) Hacer git abort, hacer git pull, resolver
- D) Eliminar la rama, crear nueva rama, empezar de nuevo
¿Qué significa el marcador <<<<<<< HEAD en un archivo?
- A) El inicio de tu archivo local
- B) El inicio de la sección en conflicto de tu rama actual (HEAD)
- C) Indica que el archivo está corrupto
- D) Marca el final de los cambios remotos
Conclusión
Los conflictos de merge pueden parecer intimidantes al principio, pero con práctica se convierten en algo rutinario. Recuerda: cada conflicto es simplemente Git pidiéndote que tomes una decisión informada sobre el código. Con las técnicas de esta lección, podrás resolver cualquier conflicto de manera eficiente y mantener tu código funcionando correctamente.
En la próxima lección, exploraremos las estrategias de branching para equipos y cómo organizar el flujo de trabajo para minimizar conflictos desde el diseño inicial del proyecto.