Saltar al contenido principal
Intermedio GitIAHerramientas

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.

Fran Cobos 7 min de lectura 1244 palabras

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:

TipoCantidad típicaEstrategia
Solo formato (misma lógica)60%Acepta una versión completa
Cambio real en ambos lados25%Merge manual
Archivos que solo tocó la IA10%Acepta la versión de la IA (o la tuya)
Archivos nuevos/eliminados5%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: --ours y --theirs se invierten en git rebase vs git 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:

  1. Abre un archivo con conflicto
  2. VS Code muestra botones: Accept Current | Accept Incoming | Accept Both | Compare
  3. 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

HerramientaPara qué
VS Code Merge EditorMerge visual de 3 vías integrado
git mergetoolAbre la herramienta de merge configurada
IntelliJ MergeEl mejor merge visual (disponible en Community Edition gratis)
meldHerramienta visual de merge para Linux
deltaMejor visualización de diffs en terminal
git rerereRecuerda 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ónAcción
Conflicto de solo formatogit checkout --ours/--theirs
Conflicto de lógica simpleVS Code Merge Editor
Conflicto complejoPasar a ChatGPT + revisar manualmente
PrevenciónCommits pequeños + merge diario + Prettier
Monorepo con IARamas cortas + no reformatear + rerere

Artículos relacionados

Fran Cobos

Fran Cobos

Desarrollador Full Stack especializado en IA aplicada, automatización y desarrollo web. Escribo sobre herramientas, tutoriales y casos reales para programadores.

¿Necesitas desarrollo a medida?

Apps web, IA, módulos ERP — cuéntame tu proyecto.