Flujo de Trabajo Git
Una estrategia de branching práctica para equipos: ramas de feature, pull requests e historial limpio de commits.
Overview
Un flujo de trabajo Git define cómo tu equipo usa ramas para gestionar trabajo paralelo, revisar cambios y mantener la rama principal estable. El flujo descrito aquí — a menudo llamado “GitHub Flow” — es ligero, escala desde desarrolladores solitarios hasta equipos grandes, e integra naturalmente con pipelines de CI/CD.
When to Use
Usa este flujo cuando:
- Trabajes en un equipo donde múltiples desarrolladores tocan la misma base de código. Consulta GitHub Actions para automatización CI/CD.
- Quieras que cada cambio sea revisado antes de llegar a producción. Consulta Unit Testing para validación pre-merge.
- Tu proyecto haga deployment continuo desde la rama principal. Consulta Docker Basics para despliegues containerizados.
- Necesites un camino claro de rollback cuando algo salga mal. Consulta Feature Flags para toggles instantáneos.
Solution
Modelo de Branching
main ───────────────────────────────────────────►
\
feature/login ──────────► (PR → review → merge)
\
feature/payments ────────► (PR → review → merge)
Comandos Diarios
# Iniciar una nueva feature
$ git checkout main
$ git pull origin main
$ git checkout -b feature/descripcion
# Hacer commits
$ git add .
$ git commit -m "feat: add password reset endpoint"
# Push y abrir pull request
$ git push -u origin feature/descripcion
# Abrir PR en GitHub, solicitar review, esperar que CI pase
# Después del merge, limpiar
$ git checkout main
$ git pull origin main
$ git branch -d feature/descripcion
Mantener un Historial Limpio (opcional)
# Antes de mergear, rebase sobre main más reciente
$ git fetch origin
$ git rebase origin/main
# Si tienes commits locales desordenados, haz squash
$ git rebase -i HEAD~3
# Cambia "pick" a "squash" para los commits que quieras combinar
Convención de Mensajes de Commit (Conventional Commits)
feat: add user authentication
fix: resolve race condition in checkout
docs: update API reference for v2
refactor: extract payment service
Explanation
mainsiempre es deployable: solo mergea código que pase tests y review.- Las ramas de feature aíslan el trabajo: cada feature, bugfix o experimento vive en su propia rama.
- Los pull requests enforce calidad: la revisión de código atrapa bugs, comparte conocimiento y mantiene estándares consistentes.
- Rebase vs. merge: rebase reescribe tu rama sobre
mainpara un historial lineal; merge preserva la secuencia exacta de eventos. Usa rebase para limpieza personal, merge para historial de equipo.
Variants
| Modelo | Ideal Para | Complejidad |
|---|---|---|
| GitHub Flow | Deployment continuo, equipos pequeños | Baja |
| Git Flow | Releases programados, ciclos de QA | Media |
| Trunk-based | Monorepos, CI muy rápido | Baja |
| Release branches | Versiones con soporte a largo plazo | Media |
Lo que funciona
- Mantén ramas de corta vida: una rama abierta por semanas acumula conflictos de merge y código obsoleto. Apunta a días, no semanas.
- Escribe mensajes de commit significativos: explica por qué, no solo qué. Tu yo futuro (y tus compañeros) te lo agradecerán.
- Revisa tu propio PR primero: lee el diff antes de solicitar reviewers. Atraparás problemas obvios.
- Automatiza con CI: ejecuta lint, tests y scans de seguridad en cada pull request antes de que alguien revise.
- Protege main: requiere reviews de PR, CI exitoso y ramas actualizadas antes de mergear a
main.
Common Mistakes
- Ramas de larga duración: cuanto más vive una rama, más difícil es mergearla. Haz rebase frecuentemente.
- Commit directo a main: incluso en proyectos solitarios, usar ramas mantiene tu historial limpio y el rollback fácil.
- Pull requests gigantes: PRs con cientos de archivos son imposibles de revisar bien. Divide capacidades grandes en PRs apiladas.
- Ignorar conflictos de merge: resolver conflictos apresuradamente sin entender ambos lados introduce bugs.
- Historial de commits desordenado: “fix”, “fix again”, “actually fix” hacen que
git blamesea inútil. Haz squash o amend antes de pushear.
Tips de Rendimiento
- Usa shallow clones para CI. Reduce el tiempo de clonación trayendo solo el último commit:
$ git clone --depth 1 https://github.com/org/repo.git
# Para una rama específica:
$ git clone --depth 1 --branch main https://github.com/org/repo.git
- Usa
git sparse-checkoutpara monorepos. Haz checkout solo de los directorios que necesitas:
$ git clone --no-checkout https://github.com/org/monorepo.git
$ cd monorepo
$ git sparse-checkout init --cone
$ git sparse-checkout set packages/api packages/shared
$ git checkout main
- Habilita
fsmonitorpara status checks más rápidos. Git usa el file watcher del SO para detectar cambios:
$ git config core.fsmonitor true
$ git config core.untrackedcache true
- Usa
git gcpara optimizar el tamaño del repositorio. Ejecuta periódicamente para comprimir objetos:
$ git gc --aggressive --prune=now
- Usa
git worktreepara trabajo paralelo. Trabaja en múltiples ramas simultáneamente sin clonar:
$ git worktree add ../repo-hotfix main
$ cd ../repo-hotfix
# Ahora estás en main en un directorio separado
# Haz cambios de hotfix mientras tu rama de feature queda abierta en el original Preguntas frecuentes
¿Debería usar merge o rebase?
Usa rebase para mantener tu rama de feature actualizada con main localmente. Usa merge (o squash-merge) cuando integres la feature a main vía pull request. Nunca hagas rebase de ramas en las que otras personas estén trabajando.
¿Con qué frecuencia debería hacer commit?
Haz commit cada vez que alcances un checkpoint lógico — un test que pasa, una función completada, un bug arreglado. Commits frecuentes hacen más fácil revertir y revisar.
¿Qué pasa si commiteo un secreto (contraseña, API key) a Git?
Rota el secreto inmediatamente — ahora está en el historial de Git. Usa herramientas como git-filter-repo o BFG Repo-Cleaner para eliminarlo del historial, luego force-push. La prevención vence a la limpieza: usa pre-commit hooks con escaneo de secretos.
Recursos Relacionados
Fundamentos de Docker
Cómo containerizar una aplicación, escribir un Dockerfile y ejecutar contenedores con Docker Compose.
RecipePruebas Unitarias
Cómo escribir pruebas unitarias rápidas y deterministas con mocks y assertions en Python, JavaScript y Java.
RecipeGitHub Actions: CI/CD
Cómo construir y desplegar con GitHub Actions usando workflows, matrices, caching y secrets.
RecipeLimpia el Historial de Commits con Git Rebase Interactivo
Haz squash, reordena, edita y divide commits con git rebase interactivo. Cubre pick, squash, fixup, reword, drop y resolución de conflictos.
DocPlantilla de Pull Request
Plantilla de pull request completa para estandarizar code reviews y mejorar la calidad de merges.
RecipeTareas programadas con Cron
Cómo programar y gestionar tareas recurrentes usando sintaxis cron en Linux, Python y Node.js.