Las ramas (branches) son una de las características más potentes de Git. Permiten desarrollar funcionalidades de forma aislada, experimentar sin riesgo y colaborar con varios desarrolladores en paralelo.

Trabajar con ramas

Las ramas en Git son livianas — un simple puntero a un commit. Crear y cambiar entre ramas es instantáneo:

# Listar ramas
git branch

# Crear una nueva rama
git branch feature/login

# Cambiar a esa rama
git checkout feature/login

# Crear y cambiar en un paso (Git >= 2.23)
git switch -c feature/login

# Eliminar una rama
git branch -d feature/login

# Ver ramas remotas
git branch -r

Merge: unir cambios

Cuando terminas una funcionalidad, fusionas los cambios a la rama principal (main o master):

git checkout main
git merge feature/login

# Merge con mensaje explícito
git merge feature/login -m "Integrar login: autenticación JWT"

Resolver conflictos de merge

Cuando dos ramas modifican las mismas líneas, Git no puede fusionar automáticamente y marca un conflicto:

# Git muestra: CONFLICT (content): Merge conflict en index.js
git status                      # Archivos en conflicto

# El archivo contendrá algo como:
<<<<<<< HEAD
const API_URL = 'https://api.ejemplo.com';
=======
const API_URL = 'https://api.produccion.com';
>>>>>>> feature/login

# Editar manualmente, luego:
git add index.js
git commit -m "Resolver conflicto en URL de API"

Sincronización remota: push y pull

Para colaborar se necesita un repositorio remoto (GitHub, GitLab, Bitbucket):

# Agregar remoto
git remote add origin https://github.com/usuario/proyecto.git

# Subir cambios
git push -u origin main          # Primera vez (-u guarda upstream)
git push                         # Posteriores

# Traer cambios
git pull                          # fetch + merge
git pull --rebase                 # fetch + rebase

Flujos de trabajo: Git Flow y GitHub Flow

Dos metodologías populares para organizar ramas:

# GIT FLOW (ramas: main, develop, feature/*, release/*, hotfix/*)
git flow init
git flow feature start nueva-funcionalidad
git flow feature finish nueva-funcionalidad

# GITHUB FLOW (rama principal + feature branches + PRs)
git checkout -b feature/mejora
# ...trabajar...
git push origin feature/mejora
# Crear Pull Request en GitHub
# Revisar, discutir, mergear

git rebase vs merge

Mientras merge crea un commit de fusión preservando el historial exacto, rebase reescribe la historia para mantener una línea lineal:

# Rebase: reaplica los commits de tu rama sobre main
git checkout feature/rama
git rebase main

# Diferencia clave:
# merge: preserva el orden cronológico exacto
# rebase: historial lineal, más limpio

# ⚠️ NO hacer rebase en ramas compartidas

git stash: guardar cambios temporales

Cuando necesitas cambiar de rama pero no quieres perder cambios sin commitear:

git stash                        # Guardar cambios
git stash list                   # Listar stashes
git stash pop                    # Recuperar y eliminar stash
git stash drop                   # Eliminar stash específico
git stash branch feature/arreglo # Crear rama desde stash
Infografía Git: Ramas, merges, conflictos y flujos de trabajo colaborativo
Infografía: Git: Ramas, merges, conflictos y flujos de trabajo colaborativo