Skip to content

Fusionar Ramas y Resolver Conflictos

Introducción

Branching aísla trabajo; merging lo integra. Aprende merges seguros, estrategias y resolución confiable de conflictos.

Requisitos

  • Flujo básico (add, commit, push)
  • Crear/cambiar ramas
  • Entender git log

Objetivos

  1. Fusionar ramas feature
  2. Diferenciar fast-forward vs merge commit
  3. Detectar y resolver conflictos
  4. Abortar o reiniciar un merge problemático
  5. Reducir frecuencia de conflictos

Modelo Mental

Un merge crea un commit con dos padres (HEAD y otra rama) salvo fast-forward. Usa un three-way merge:

BASE (ancestro común)
HEAD (rama actual)
OTHER (rama a fusionar)

Differences BASE→HEAD y BASE→OTHER; overlap = conflicto.

Fast-Forward vs Merge Commit

EscenarioResultadoCuándoProsContras
Fast-forwardMover punteroHEAD atrás de otraHistoria linealPierde contexto de rama
Merge commitNuevo commit 2 padresHistorias divergentesPunto de integraciónMás ruido

Forzar merge commit:

bash
git merge --no-ff feature/login

Flujo Básico

bash
git checkout main
git pull origin main
git merge feature/login
git push origin main

Vista Previa

bash
git log --oneline main..feature/login
git merge --no-commit --no-ff feature/login
# Abort
git merge --abort

Escenario de Conflicto

git merge feature/rate-limit
# CONFLICT ...

Marcadores:

<<<<<<< HEAD
"rateLimit": 200,
=======
"rateLimit": 500,
>>>>>>> feature/rate-limit

Inspección

bash
git status
git diff
git diff --name-only --diff-filter=U

Luego:

bash
git add config/app.json
git commit

Mensaje custom:

bash
git commit -m "Merge feature/rate-limit: ajusta a 300"

Abortar

bash
git merge --abort

Opciones

OpciónPropósito
--no-ffForzar merge commit
--squashConsolidar sin merge commit
--no-commitPausar antes de commit
--abortDeshacer merge pendiente
-X oursPreferir actual
-X theirsPreferir rama fusionada

Squash:

bash
git merge --squash feature/search
git commit -m "Add search"

Visualizar

bash
git log --graph --oneline --decorate

Herramientas

bash
git mergetool

Prevención

  1. Rebase/pull frecuente
  2. Ramas pequeñas
  3. No mezclar formato con lógica
  4. Linting consistente
  5. Comunicar refactors grandes

Binarios

bash
git checkout --ours path/to/img.png
git checkout --theirs path/to/img.png
git add path/to/img.png

Problemas Comunes

ProblemaCausaFix
Conflictos repetidosRama longevaRebase temprano
Bloques enormesFormato + lógica juntosSeparar formato
Merge accidentalConfig/Policygit pull --ff-only
Cambios perdidosRestore antes de stagegit reflog

Checklist Pre-Merge

  • [ ] CI verde
  • [ ] Review aplicado
  • [ ] Actualizado con main
  • [ ] Sin secretos/debug
  • [ ] Mensajes limpios

Resumen

Comprende el tipo de merge, revisa commits entrantes, resuelve quirúrgicamente y commit claro. Buen hygiene = menos fricción.


Comandos Clave

bash
git merge <branch>
git merge --no-ff <branch>
git merge --squash <branch>
git merge --abort
git diff --name-only --diff-filter=U
git log --graph --oneline --decorate