Skip to content
SP StackPractices
beginner Por StackPractices

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
# trabajo y commits locales
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 features, 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.

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

## Best Practices

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

## Frequently Asked Questions

### 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 comprehensivo, 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.