Documento de Estrategia de Branching en Git
Una plantilla de documento para definir flujo de trabajo Git, convenciones de ramas, requisitos de merge y procedimientos de release para equipos de ingenieria.
Overview
Cada equipo que usa Git sin una estrategia de branching documentada eventualmente crea caos. Los desarrolladores crean ramas desde el lugar equivocado, los hotfixes evaden revision, los tags de release son inconsistentes, y revertir se convierte en un juego de adivinanzas. Un documento de estrategia de branching define como tu equipo usa Git: de donde vienen las ramas, como se mergean, quien puede aprobar, y como ocurren los releases.
When to Use
- For alternatives, see Engineering Handbook Template.
Usa este documento cuando:
- Tu equipo tiene mas de dos desarrolladores commiteando al mismo repositorio
- Necesitas soportar multiples releases concurrentes o entornos
- Los hotfixes frecuentemente entran en conflicto con desarrollo en curso
- Los nuevos miembros del equipo luchan por entender como contribuir
- Tu pipeline de CI/CD requiere patrones de branch especificos para disparar despliegues
Prerequisites
Antes de definir la estrategia:
- Entender tu cadencia de release (continuo, diario, semanal, por milestone)
- Conocer tus entornos de despliegue y como el codigo llega a ellos
- Decidir si necesitas soportar multiples versiones de produccion simultaneamente
- Confirmar que tu sistema de CI/CD puede disparar en patrones de branch o tags
- Alinear con producto sobre expectativas de rollback y tiempo de respuesta para hotfixes
Solution
# Estrategia de Branching Git: `<Proyecto/Equipo>`
> Version: ______ | Ultima actualizacion: ______ | Responsable: ______
## 1. Tipos de Ramas
### Ramas Principales
| Rama | Proposito | Proteccion | Duracion |
|------|-----------|------------|----------|
| `main` | Codigo listo para produccion | Requiere PR + 2 aprobaciones + CI verde | Permanente |
| `staging` | Validacion pre-produccion | Requiere PR + 1 aprobacion + CI verde | Permanente |
| `develop` | Rama de integracion para features | Requiere PR + 1 aprobacion + CI verde | Permanente |
### Ramas de Soporte
| Prefijo | Proposito | Fuente | Merge Target | Nomenclatura |
|---------|---------|--------|--------------|--------------|
| `feature/` | Nueva funcionalidad | `develop` | `develop` | `feature/TICKET-descripcion-corta` |
| `bugfix/` | Fixes no urgentes | `develop` | `develop` | `bugfix/TICKET-descripcion-corta` |
| `hotfix/` | Fixes criticos de produccion | `main` | `main` + `develop` | `hotfix/TICKET-descripcion-corta` |
| `release/` | Preparacion de release | `develop` | `main` + `staging` | `release/v1.2.3` |
| `chore/` | Mantenimiento, dependencias | `develop` | `develop` | `chore/TICKET-descripcion-corta` |
| `docs/` | Solo documentacion | `develop` | `develop` | `docs/TICKET-descripcion-corta` |
## 2. Flujo de Trabajo
### Desarrollo de Features
```bash
git checkout develop && git pull origin develop
git checkout -b feature/PROJ-123-add-user-auth
git push origin feature/PROJ-123-add-user-auth
## abrir PR a develop
Flujo de Hotfix
git checkout main && git pull origin main
git checkout -b hotfix/PROJ-456-fix-payment-webhook
## fix, test, commit
git push origin hotfix/PROJ-456-fix-payment-webhook
## PR a main (revision expeditada)
## despues del merge, backport a develop
git checkout develop && git cherry-pick <hotfix-commit>
Flujo de Release
git checkout develop && git pull origin develop
git checkout -b release/v1.2.3
## version bump, changelog, QA final
git checkout staging && git merge --no-ff release/v1.2.3
git checkout main && git merge --no-ff release/v1.2.3
git tag -a v1.2.3 -m "Release version 1.2.3"
git push origin v1.2.3
git checkout develop && git merge --no-ff main
3. Convenciones de Commits
Seguimos Conventional Commits:
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
Tipos
| Tipo | Uso Para | Dispara Release |
|---|---|---|
feat | Nueva funcionalidad | Minor |
fix | Bug fix | Patch |
docs | Solo documentacion | Ninguno |
style | Formateo | Ninguno |
refactor | Cambio sin cambio de comportamiento | Ninguno |
perf | Mejora de rendimiento | Patch |
test | Tests | Ninguno |
chore | Proceso, dependencias | Ninguno |
ci | CI/CD | Ninguno |
revert | Revertir commit previo | Patch |
Ejemplos
feat(auth): add Google OAuth2 login
Implements OAuth2 flow with PKCE for web clients.
Closes PROJ-123
fix(payments): validate webhook signature
Prevents replay attacks by verifying Stripe signature
header before processing events.
Closes PROJ-456
4. Requisitos de Merge
Requisitos de Pull Request
| Requisito | Feature/Bugfix | Hotfix | Release |
|---|---|---|---|
| CI pasa | Requerido | Requerido | Requerido |
| Aprobaciones de review | 2 | 1 (expeditado) | 2 |
| Ticket enlazado | Requerido | Requerido | Requerido |
| Tests agregados | Requerido | Requerido | N/A |
| Documentacion actualizada | Si cambia funcionalidad | Si cambia comportamiento | Changelog actualizado |
| Revision de seguridad | Si auth/datos | Requerido | N/A |
Estrategias de Merge
| Rama Target | Estrategia | Razonamiento |
|---|---|---|
develop | Squash and merge | Historial limpio; un commit por feature |
main | Merge commit | Preserva historial de release |
hotfix a main | Merge commit | Preserva identificacion del hotfix |
5. Tagging y Versionado
Seguimos Semantic Versioning:
- MAJOR: Cambios breaking en API
- MINOR: Nuevas capacidades, backward compatible
- PATCH: Bug fixes, backward compatible
Formato de Tag
git tag -a v1.2.3 -m "Release v1.2.3"
git tag -a v1.2.3-rc.1 -m "Release candidate 1"
git tag -a v1.2.4 -m "Hotfix: fix payment webhook validation"
Reglas de Bump de Version
| Tipo de Commit | Bump de Version |
|---|---|
feat | Minor (x.Y.z) |
fix, perf, revert | Patch (x.y.Z) |
feat con BREAKING CHANGE | Major (X.y.z) |
docs, style, refactor, test, chore, ci | Ninguno |
6. Procedimientos de Rollback
Revertir un Despliegue
git log --oneline --decorate --tags
git checkout v1.2.2
git checkout -b hotfix/rollback-v1.2.3
git push origin hotfix/rollback-v1.2.3
## abrir PR de emergencia a main
Revertir un Merge
git log --oneline --merges
git revert -m 1 <merge-commit-hash>
## abrir PR con commit de revert
7. Reglas de Proteccion
Branch Protection (GitHub/GitLab)
| Regla | main | staging | develop |
|---|---|---|---|
| Requerir PR | Si | Si | Si |
| Aprobaciones requeridas | 2 | 1 | 1 |
| Desechar aprobaciones stale | Si | Si | No |
| Requerir status checks | Si | Si | Si |
| Incluir administradores | Si | Si | No |
| Requerir historial lineal | No | No | Si |
| Permitir force push | No | No | No |
| Permitir borrados | No | No | No |
## Explanation
El documento separa la estrategia de branching en **tipos de ramas** (como se llaman y para que sirven), **flujo de trabajo** (como crearlas y mergearlas), **convenciones de commits** (como describir cambios), y **reglas de proteccion** (como prevenir accidentes). El principio clave es que cada rama tiene exactamente un proposito y exactamente un target de merge. La ambiguedad sobre de donde vienen las ramas y a donde van crea los conflictos de merge y errores de despliegue que ralentizan a los equipos.
## Ejemplo de Flujo de Hotfix
```bash
# 1. Crear rama de hotfix desde main
git checkout main
git pull origin main
git checkout -b hotfix/fix-payment-webhook-validation
# 2. Hacer el fix
git add src/payments/webhook.go
git commit -m "fix(payments): validate webhook signature
Prevents replay attacks by verifying Stripe signature
header before processing events.
Closes PROJ-456"
# 3. Push y abrir PR a main (expeditado)
git push origin hotfix/fix-payment-webhook-validation
# Crear PR con label "hotfix" para revision expeditada
# 4. Despues de merge a main, tag el hotfix
git checkout main
git pull origin main
git tag -a v1.2.4 -m "Hotfix: fix payment webhook validation"
git push origin v1.2.4
# 5. Backport a develop
git checkout develop
git pull origin develop
git merge --no-ff main
git push origin develop
Variants
| Estrategia | Mejor Para | Trade-off |
|---|---|---|
| GitFlow (como arriba) | Releases programados, multiples versiones | Mas ramas, mas proceso |
| GitHub Flow (main + feature) | Despliegue continuo, version unica | Mas simple, pero sin staging de release |
| Trunk-based (solo main) | CD de alta velocidad, feature flags | Requiere CI/CD maduro y feature flags |
| Release branching (por version) | Productos con versiones LTS | Mas overhead de backporting |
Lo que funciona
- Automatiza la proteccion — reglas de branch protection y CI checks atrapan errores antes del merge
- Mantene ramas de corta vida — ramas de feature mayores a una semana crean riesgo de integracion
- Tag cada release — los tags son la unica forma confiable de identificar lo que esta en produccion
- Requiere links a tickets — commits sin contexto son inutiles para postmortems
- Documenta excepciones — si alguien evade el proceso, documenta por que y si fue la decision correcta
Common Mistakes
- Permitir push directo a main — incluso ingenieros senior cometen errores; branch protection es innegociable
- No hacer backport de hotfixes a develop — el mismo bug se despliega en el siguiente release
- Nomenclatura inconsistente de ramas — dificulta la automatizacion y el escaneo humano
- Squash-merging hotfixes — pierde la habilidad de cherry-pickar o identificar el commit del fix
- No borrar ramas mergeadas — el desorden dificulta encontrar trabajo activo
Troubleshooting
- Pipeline fails silently: enable verbose logging and store pipeline artifacts between stages so you can inspect the exact state that failed.
- Container crashes on startup: check that environment variables, secrets, and config files are mounted correctly. Read the first 50 lines of logs before scaling replicas.
- Deployment rolls back repeatedly: verify health checks, resource limits, and startup probes. A failing readiness probe is a common cause of rolling restarts.
- Slow CI builds: cache dependencies and docker layers. Split large test suites into parallel jobs to reduce wall-clock time.
- Drift between environments: use infrastructure-as-code and immutable artifacts.
Preguntas frecuentes
Debemos usar GitFlow, GitHub Flow, o trunk-based development?
GitFlow funciona bien para equipos con releases programados y necesidad de estabilizacion de release. GitHub Flow (solo main + ramas de feature) es mas simple y funciona para despliegue continuo. Trunk-based requiere la mayor madurez — feature flags, testing automatizado exhaustivo, y CI/CD rapido. La mayoria de los equipos deberian empezar con GitHub Flow y adoptar GitFlow solo cuando la complejidad de gestion de releases lo demande.
Como manejamos ramas de feature de larga duracion?
Evitalas. Si una feature toma mas de una semana, dividela en entregables mas pequenos detras de feature flags. Si es inevitable, rebasea la rama de feature sobre develop diariamente para prevenir pesadillas de integracion. El costo de resolver un merge conflict de una semana de antiguedad es exponencialmente mayor que un rebase diario.
Que pasa si un hotfix entra en conflicto con trabajo ya en develop?
Resuelve el conflicto al hacer backport. La rama de hotfix mergea limpiamente a main (salio de main), pero cherry-pick o merge a develop pueden tener conflictos. Testea la resolucion del conflicto en una rama de feature antes de mergear a develop.
Como manejamos releases con multiples versiones en produccion?
Para productos con multiples versiones LTS en produccion: usa ramas de release (release/1.x, release/2.x). Cada rama de release tiene su propio pipeline de CI y recibe backports de hotfixes. Documenta que versiones estan soportadas y cuales estan EOL. Cuando un hotfix entra a main, cherry-pick a cada rama de release soportada. Tag cada hotfix con el version correcto (v1.4.1, v2.1.3). Mantén un matriz de compatibilidad de versiones. Programa EOL con al menos 6 meses de anticipacion y notifica a los usuarios.
Que hacemos con ramas de feature abandonadas?
Ramas de feature abandonadas crean desorden y confusion. Establece una politica: ramas sin actividad por 30 dias se marcan como "stale" con un comentario automatico. Despues de 60 dias sin actividad, se eliminan automaticamente (con notificacion previa). Si el trabajo aun es relevante, se puede recrear la rama o reabrir el PR. Documenta features abandonadas en el ticket para que el contexto no se pierda. Usa GitHub Actions o scripts para automatizar el proceso de stale branches. Mantén el repo limpio — las ramas activas deberian ser solo las que tienen trabajo en progreso.
Como manejamos conflictos de merge durante un release freeze?
Durante un release freeze: no merges a main. Los features pueden seguir mergeandose a develop. Si un hotfix critico es necesario durante el freeze: sigue el proceso de hotfix normal pero notifica al release manager. Documenta el hotfix en las notas de release. Si el freeze es por una temporada alta (ej., Black Friday): prepara ramas de feature antes del freeze y haz staging de releases para despues. Comunica el freeze con fechas claras y excepciones definidas. No prolongues el freeze mas de lo necesario — los freezes largos acumulan cambios y aumentan el riesgo post-freeze.
Como integramos conventional commits con release automatico?
Usa semantic-release o release-please para automatizar el versionado basado en conventional commits. semantic-release analiza los commits desde el ultimo release, determina el bump de version (major, minor, patch), genera el changelog, crea el tag, y publica el release. Configura el pipeline de CI para ejecutar semantic-release en cada merge a main. Para pre-releases, usa conventional commits con sufijos (ej., feat(auth): add OAuth2 login [skip ci]). Asegura que todos los ingenieros entiendan conventional commits — un commit mal tipado causa un bump incorrecto. Usa commitlint en CI para validar el formato antes del merge.
Recursos Relacionados
Plantilla de Engineering Handbook
Una plantilla para documentar la cultura del equipo, procesos de desarrollo, estandares tecnicos y practicas operacionales en un handbook unico y referenciable.
DocPlantilla de Checklist para Code Review
Una checklist estructurada para realizar revisiones de codigo consistentes y exhaustivas que detecten bugs, mejoren la legibilidad y compartan conocimiento entre el equipo.
DocPlantilla de Checklist de Despliegue
Una checklist de verificación pre-release para despliegues seguros en producción.
DocChecklist de Onboarding para Ingenieros Backend
Una checklist completa para incorporar nuevos ingenieros backend que cubre la configuración del entorno, la orientación al codebase, la formación en seguridad y las metas de la primera semana.
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.