Cómo Resolver un Git Merge Conflict Masivo Provocado por Código de IA
Git merge conflicts gigantes por código generado con Copilot, Cursor o ChatGPT. Herramientas, estrategias y comandos para resolverlos sin perder tu trabajo.
Tabla de contenidos
Tu compañero pushea cambios en main. Tú llevas 3 días en una rama donde Cursor refactorizó medio proyecto. Haces git merge main y:
Auto-merging src/components/Dashboard.tsx
CONFLICT (content): Merge conflict in src/components/Dashboard.tsx
Auto-merging src/utils/api.ts
CONFLICT (content): Merge conflict in src/utils/api.ts
Auto-merging src/hooks/useAuth.ts
CONFLICT (content): Merge conflict in src/hooks/useAuth.ts
...
Automatic merge failed; fix conflicts and then commit the result.
37 archivos con conflictos. No puedes hacer merge. No puedes hacer push. Estás atrapado.
Esto pasa todo el tiempo con código generado por IA. La IA toca muchos archivos, reformatea código existente y genera cambios “ruidosos” que Git no puede resolver automáticamente.
Por qué la IA genera más conflictos
1. Refactoring masivo
Cuando le pides a Cursor “refactoriza el módulo de auth”, toca 15 archivos. Si alguien editó cualquiera de esos 15 archivos en otra rama → conflicto.
2. Reformateo invisible
La IA a menudo cambia el formato del código sin cambiar la lógica:
// Tu compañero escribió:
- const result = await fetch(url).then(r => r.json())
// La IA "mejoró" el mismo archivo:
+ const response = await fetch(url);
+ const result = await response.json();
Semánticamente es lo mismo, pero Git ve líneas diferentes → conflicto.
3. Imports reorganizados
// Rama original:
- import { useState } from 'react';
- import { useRouter } from 'next/router';
// La IA reorganizó:
+ import { useRouter } from 'next/router';
+ import { useState } from 'react';
Solo cambió el orden. Git: CONFLICT.
Paso 1: No entres en pánico — Evalúa el daño
# ¿Cuántos archivos tienen conflicto?
git diff --name-only --diff-filter=U
# ¿Cuántos conflictos por archivo?
grep -rn "<<<<<<< " --include="*.ts" --include="*.tsx" --include="*.js" | wc -l
# Ver un resumen visual
git mergetool --tool=vimdiff # O usa VS Code
Clasifica los conflictos:
| Tipo | Cantidad típica | Estrategia |
|---|---|---|
| Solo formato (misma lógica) | 60% | Acepta una versión completa |
| Cambio real en ambos lados | 25% | Merge manual |
| Archivos que solo tocó la IA | 10% | Acepta la versión de la IA (o la tuya) |
| Archivos nuevos/eliminados | 5% | Decide cuáles mantener |
Paso 2: Resuelve los conflictos fáciles primero
Acepta una versión completa para archivos de solo formato
# Acepta la versión de la rama actual (la tuya / la de la IA)
git checkout --ours src/utils/format.ts
# Acepta la versión de la otra rama (main)
git checkout --theirs src/utils/format.ts
# Marcar como resuelto
git add src/utils/format.ts
Resolver varios archivos de golpe
# Aceptar TODOS los archivos de un directorio desde la otra rama
git checkout --theirs src/styles/*
git add src/styles/*
# Aceptar todos los archivos que solo cambió la IA
# (archivos que no existen en la otra rama = solo IA los tocó)
git diff --name-only --diff-filter=U | xargs git checkout --ours
Cuidado:
--oursy--theirsse invierten engit rebasevsgit merge. En merge:ours= tu rama,theirs= la rama que estás mergeando. En rebase es al revés.
Paso 3: VS Code Merge Editor para conflictos complejos
VS Code tiene un editor de merge visual:
- Abre un archivo con conflicto
- VS Code muestra botones: Accept Current | Accept Incoming | Accept Both | Compare
- Usa “Compare Changes” para ver las diferencias lado a lado
Para archivos más complejos:
Ctrl+Shift+P → "Merge Editor: Open Merge Editor"
El editor de 3 vías muestra:
- Izquierda: Tu versión (current)
- Derecha: La otra versión (incoming)
- Abajo: El resultado combinado
Puedes seleccionar líneas de cada lado y construir el resultado.
Paso 4: Pedir a la IA que resuelva el conflicto
Para conflictos específicos, puedes pasar el diff a un modelo:
Este archivo tiene un merge conflict. Aquí está el diff completo:
[Pega el contenido del archivo con los marcadores <<<<<<< ======= >>>>>>>]
Resuelve el conflicto combinando ambas versiones. Mantén toda la
funcionalidad de ambas ramas. Dame el archivo completo resuelto,
SIN marcadores de conflicto.
Cuándo funciona bien: Conflictos en imports, cambios de formato, renombrado de variables.
Cuándo NO usarlo: Lógica de negocio diferente en ambas ramas, cambios en la estructura de datos.
Paso 5: Verificar y commitear
# Verificar que no quedan conflictos
grep -rn "<<<<<<< " --include="*.ts" --include="*.tsx" --include="*.js"
# (debe devolver 0 resultados)
# Verificar que compila
npm run build
# Verificar que los tests pasan
npm test
# Commit del merge
git add -A
git commit -m "merge: resolver conflictos con main tras refactor IA"
Cómo prevenir conflictos masivos con IA
1. Commits pequeños y frecuentes
# ❌ Un commit gigante tras 3 días de refactoring con IA
git add -A && git commit -m "refactor everything"
# ✅ Un commit por cada tarea del agente
git add src/auth/ && git commit -m "refactor: auth module con Cursor"
git add src/api/ && git commit -m "refactor: api client con Cursor"
2. Merge main frecuentemente
# Cada mañana, antes de seguir trabajando con la IA:
git fetch origin
git merge origin/main
# Resolver conflictos pequeños es más fácil que uno masivo
3. Configura Prettier ANTES del refactoring de IA
Si todos usan el mismo Prettier config, la IA no puede reformatear “a su estilo”:
# Antes del refactoring, formatea todo el proyecto
npx prettier --write "src/**/*.{ts,tsx,js,jsx}"
git add -A && git commit -m "style: formateo con prettier"
# AHORA deja que la IA trabaje
# Los cambios serán solo de lógica, no de formato
4. Pide a la IA que no reformatee
Modifica SOLO la lógica de autenticación en src/auth/service.ts.
NO cambies el formato, el orden de los imports ni renombres variables
que no sean necesarias. Minimiza los cambios — menos líneas cambiadas =
menos conflictos en git.
5. Usa ramas cortas
# ❌ Rama de 2 semanas con 200 commits de IA
git checkout -b feature/mega-refactor # Conflictos garantizados
# ✅ Ramas de 1-2 días máximo
git checkout -b fix/auth-validation # Merge rápido, pocos conflictos
Herramientas útiles
| Herramienta | Para qué |
|---|---|
| VS Code Merge Editor | Merge visual de 3 vías integrado |
| git mergetool | Abre la herramienta de merge configurada |
| IntelliJ Merge | El mejor merge visual (disponible en Community Edition gratis) |
| meld | Herramienta visual de merge para Linux |
| delta | Mejor visualización de diffs en terminal |
| git rerere | Recuerda cómo resolviste conflictos anteriores |
Activar git rerere (muy recomendado)
git config --global rerere.enabled true
rerere = “reuse recorded resolution”. Si resuelves un conflicto y luego haces otro merge con el mismo conflicto, Git lo resuelve automáticamente con la misma solución.
Resumen
| Situación | Acción |
|---|---|
| Conflicto de solo formato | git checkout --ours/--theirs |
| Conflicto de lógica simple | VS Code Merge Editor |
| Conflicto complejo | Pasar a ChatGPT + revisar manualmente |
| Prevención | Commits pequeños + merge diario + Prettier |
| Monorepo con IA | Ramas cortas + no reformatear + rerere |
Artículos relacionados
- Comandos Git esenciales — los comandos que necesitas para manejar conflictos
- Cursor vs Copilot vs Windsurf — qué editor genera cambios más limpios
- Errores comunes al configurar IA en VS Code — problemas con extensiones de IA