beginner Por Mathias Paulenko

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.

Nota para desarrolladores hispanohablantes: Esta guía incluye ejemplos y convenciones de nomenclatura adaptadas a equipos que trabajan en español. Cuando existen diferencias significativas en terminología técnica entre el inglés y el español, se indican explícitamente para facilitar la comunicación en equipos multiculturales.

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

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

TipoUso ParaDispara Release
featNueva funcionalidadMinor
fixBug fixPatch
docsSolo documentacionNinguno
styleFormateoNinguno
refactorCambio sin cambio de comportamientoNinguno
perfMejora de rendimientoPatch
testTestsNinguno
choreProceso, dependenciasNinguno
ciCI/CDNinguno
revertRevertir commit previoPatch

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

RequisitoFeature/BugfixHotfixRelease
CI pasaRequeridoRequeridoRequerido
Aprobaciones de review21 (expeditado)2
Ticket enlazadoRequeridoRequeridoRequerido
Tests agregadosRequeridoRequeridoN/A
Documentacion actualizadaSi cambia funcionalidadSi cambia comportamientoChangelog actualizado
Revision de seguridadSi auth/datosRequeridoN/A

Estrategias de Merge

Rama TargetEstrategiaRazonamiento
developSquash and mergeHistorial limpio; un commit por feature
mainMerge commitPreserva historial de release
hotfix a mainMerge commitPreserva 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 CommitBump de Version
featMinor (x.Y.z)
fix, perf, revertPatch (x.y.Z)
feat con BREAKING CHANGEMajor (X.y.z)
docs, style, refactor, test, chore, ciNinguno

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)

Reglamainstagingdevelop
Requerir PRSiSiSi
Aprobaciones requeridas211
Desechar aprobaciones staleSiSiNo
Requerir status checksSiSiSi
Incluir administradoresSiSiNo
Requerir historial linealNoNoSi
Permitir force pushNoNoNo
Permitir borradosNoNoNo

## 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

EstrategiaMejor ParaTrade-off
GitFlow (como arriba)Releases programados, multiples versionesMas ramas, mas proceso
GitHub Flow (main + feature)Despliegue continuo, version unicaMas simple, pero sin staging de release
Trunk-based (solo main)CD de alta velocidad, feature flagsRequiere CI/CD maduro y feature flags
Release branching (por version)Productos con versiones LTSMas overhead de backporting

Lo que funciona

  1. Automatiza la proteccion — reglas de branch protection y CI checks atrapan errores antes del merge
  2. Mantene ramas de corta vida — ramas de feature mayores a una semana crean riesgo de integracion
  3. Tag cada release — los tags son la unica forma confiable de identificar lo que esta en produccion
  4. Requiere links a tickets — commits sin contexto son inutiles para postmortems
  5. Documenta excepciones — si alguien evade el proceso, documenta por que y si fue la decision correcta

Common Mistakes

  1. Permitir push directo a main — incluso ingenieros senior cometen errores; branch protection es innegociable
  2. No hacer backport de hotfixes a develop — el mismo bug se despliega en el siguiente release
  3. Nomenclatura inconsistente de ramas — dificulta la automatizacion y el escaneo humano
  4. Squash-merging hotfixes — pierde la habilidad de cherry-pickar o identificar el commit del fix
  5. 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....
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...
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...
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....
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,...
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...
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,...