Guía de Flujo de Trabajo con Git: Ramas, Fusiones y Colaboración en Equipo
Domina las estrategias de ramificación en Git, las mejores prácticas para commits, rebasing vs. merging, y los flujos de trabajo que usan los equipos de ingeniería profesionales.
Git es la base del flujo de trabajo de todo equipo de software moderno. Sin embargo, muchos desarrolladores solo usan commit, push y pull, dejando de lado las funciones que hacen que el desarrollo colaborativo sea fluido y libre de conflictos. Esta guía cubre las estrategias de ramificación, las prácticas de commits y los comandos cotidianos que utilizan los equipos profesionales.
El modelo mental fundamental
Git es un grafo acíclico dirigido de instantáneas (commits). Cada commit apunta a su(s) padre(s). Las ramas son simplemente punteros con nombre hacia commits — ligeros y fáciles de crear.
main: A → B → C → D
feature: C → E → F
Crear una rama no copia archivos — solo crea un nuevo puntero. Por eso crear una rama tarda milisegundos independientemente del tamaño del repositorio.
Estrategias de ramificación
GitHub Flow (simple, entrega continua)
Ideal para equipos que despliegan con frecuencia:
mainsiempre está listo para desplegar- Crea una rama de funcionalidad para cada cambio
- Abre un pull request cuando esté listo para revisión
- Fusiona a
maintras la aprobación - Despliega de inmediato
git checkout -b feature/add-user-auth
# ... realiza cambios ...
git push origin feature/add-user-auth
# Abre PR → revisión → fusión → despliegue
Git Flow (lanzamientos estructurados)
Ideal para productos con versiones de lanzamiento (aplicaciones, librerías):
main— solo código en produccióndevelop— rama de integraciónfeature/*— nuevas funcionalidades (rama desdedevelop)release/*— preparación de lanzamientos (rama desdedevelop)hotfix/*— correcciones urgentes en producción (rama desdemain)
Es más estructurado pero añade sobrecarga. Usa GitHub Flow a menos que tengas una necesidad real de gestión de lanzamientos paralelos.
Desarrollo basado en Trunk
Los desarrolladores hacen commits directamente a main (o ramas de muy corta duración < 1 día). Los feature flags controlan lo que ven los usuarios. Requiere un CI/CD sólido y buena cobertura de tests. Utilizado por Google, Facebook y equipos de alto rendimiento.
Cómo escribir buenos mensajes de commit
El mensaje de commit es una carta para tu yo del futuro (y para tus compañeros). Sigue el formato Conventional Commits:
<tipo>(<ámbito>): <resumen breve>
<cuerpo opcional — qué y por qué, no cómo>
<pie opcional — cambios incompatibles, referencias a issues>
Tipos:
feat— nueva funcionalidadfix— corrección de erroresdocs— solo documentaciónrefactor— cambio de código que ni corrige un error ni añade una funcionalidadtest— añadir o corregir testschore— proceso de construcción, dependencias, herramientas
Ejemplos:
feat(auth): add JWT refresh token rotation
Implements sliding session windows using refresh token rotation.
Previous tokens are invalidated on use to detect theft.
Closes #142
fix(api): return 404 instead of 500 for missing user
The /users/:id endpoint was throwing an unhandled exception when
the user didn't exist. Now returns a proper 404 with error message.
Regla general: Si tu mensaje de commit es
fix stuffoWIP, tu equipo te odia. Hazlo descriptivo.
Merge vs. Rebase
Merge
git checkout main
git merge feature/my-feature
Crea un commit de fusión que une dos ramas. Preserva el historial completo — puedes ver exactamente cuándo las ramas divergieron y se fusionaron.
A → B → C → M (commit de fusión)
↑ ↑
E → F (feature)
Usa merge para: integrar ramas de larga duración, preservar el contexto en el historial.
Rebase
git checkout feature/my-feature
git rebase main
Reproduce tus commits sobre la rama destino. Crea un historial lineal — parece como si la funcionalidad hubiera sido construida sobre el último estado de main.
Antes: A → B → C (main)
↑
D → E (feature, basado en B)
Después: A → B → C → D' → E' (feature rebasado sobre C)
Usa rebase para: limpiar commits locales antes de un PR, mantener las ramas de funcionalidad actualizadas.
Regla de oro: Nunca hagas rebase de commits que ya han sido enviados a una rama compartida. El rebase reescribe el historial — rompe las ramas locales de otras personas.
Rebase interactivo: limpiando el historial
Antes de abrir un PR, aplasta y corrige commits desordenados de trabajo en progreso:
git rebase -i HEAD~4 # edita interactivamente los últimos 4 commits
Opciones en el editor interactivo:
pick— mantener el commitsquash— fusionar con el commit anterior, combinar mensajesfixup— fusionar con el commit anterior, descartar el mensajereword— mantener los cambios, editar el mensajedrop— eliminar el commit por completo
Gestión de conflictos
Los conflictos ocurren cuando dos ramas modifican las mismas líneas. Git los marca así:
<<<<<<< HEAD (tu rama)
const timeout = 5000;
=======
const timeout = 3000;
>>>>>>> feature/update-timeouts
Resuélvelos editando el archivo al estado correcto (eliminando los marcadores), y luego:
git add src/config.ts
git merge --continue # o git rebase --continue
Prevenir es mejor que curar:
- Haz pull desde
maincon frecuencia para mantener las ramas de corta duración - Comunícate con tus compañeros cuando trabajes en los mismos archivos
- Mantén los PRs pequeños — los PRs grandes tienen más conflictos y revisiones más difíciles
Comandos esenciales del día a día
# Iniciar una nueva funcionalidad
git checkout -b feature/my-feature
# Agregar cambios específicos al stage (no el archivo completo)
git add -p
# Ver cambios sin stage
git diff
# Ver cambios en stage
git diff --staged
# Modificar el último commit (antes de hacer push)
git commit --amend --no-edit
# Guardar temporalmente trabajo sin commitear
git stash
git stash pop
# Encontrar qué commit introdujo un error (búsqueda binaria)
git bisect start
git bisect bad # el commit actual es malo
git bisect good v1.2.0 # último commit bueno conocido
# Recuperar una rama eliminada o un commit perdido
git reflog
# Ver un gráfico visual de las ramas
git log --oneline --graph --all
Buenas prácticas para pull requests
Un buen PR:
- Hace una sola cosa — los revisores pueden entender el cambio completo
- Tiene una descripción clara — qué cambió, por qué y cómo probarlo
- Es pequeño — < 400 líneas de diff como objetivo aproximado
- Pasa el CI — nunca pidas revisión con una build rota
- Enlaza al issue —
Closes #42cierra el issue automáticamente al fusionar
Usa nuestro README Generator para generar documentación junto con tus cambios de código.
Lo esencial de .gitignore
Añade siempre esto a .gitignore:
# Variables de entorno
.env
.env.local
.env.*.local
# Dependencias
node_modules/
vendor/
# Salida de compilación
dist/
build/
.next/
# Archivos del sistema operativo
.DS_Store
Thumbs.db
# Archivos del editor
.vscode/settings.json
.idea/
*.swp
Genera un .gitignore específico para tu proyecto en gitignore.io — conoce cientos de lenguajes y herramientas.
El dominio de Git se acumula con el tiempo. Aprende el modelo mental, adopta buenos hábitos de commit, y la colaboración de tu equipo mejorará de forma notable.