Estrategias de ramas
Trunk-based, release branches o GitFlow — elige según tu cadencia de entrega real, con las señales de que has superado el modelo actual.
Un equipo de seis ingenieros despliega desde main cada día. Dos años
después son cincuenta, GitFlow está en la wiki y un release supone una semana
de conflictos de merge y "espera, ¿ese fix estaba en el último corte?". Nadie
decidió hacerlo más difícil. El modelo de ramas simplemente se quedó igual
mientras todo lo demás cambiaba.
Elegir una estrategia de ramas no es elegir una favorita. Es elegir qué problemas estás dispuesto a tener — porque cada modelo intercambia un conjunto de dolores por otro.
¿Con qué frecuencia puedes enviar realmente? La pregunta que elige tu modelo de ramas
Olvida los diagramas. Cada modelo de ramas es una respuesta diferente a una
sola pregunta: ¿con qué frecuencia puede un cambio en main llegar a un
usuario real?
| Estrategia | Respuesta | Coste implícito |
|---|---|---|
| Trunk-based | Hoy, varias veces | Inversión en CI, tests y feature flags |
| Release branches | Cada sprint o cadencia fija | Coordinación adicional por cada corte |
| GitFlow | Cuando develop está "listo" | Dos ramas de larga vida, integración manual |
Elige el modelo que coincida con la frecuencia con que realmente despligas, no con la que te gustaría.
Si despliegas cada dos semanas pero finges hacerlo a diario, trunk-based se sentirá caótico. Si despliegas cada día pero finges hacerlo mensualmente, GitFlow se sentirá como caminar entre cemento.
Trunk-based: el modelo con menos sorpresas
Una rama de larga vida (main). Ramas de feature de corta vida que se mergean
en horas o un día. Cada merge a main es potencialmente desplegable.
Funciona cuando:
- El CI es lo suficientemente rápido para que nadie lo saltee (menos de ~10 minutos de extremo a extremo)
- Los tests detectan suficientes regresiones para que un build verde sea una señal real
- Puedes desplegar trabajo sin terminar de forma segura — habitualmente con feature flags
No funciona cuando:
- Un CI inestable hace que la gente acumule cambios hasta que la cola se despeje
- Despliegas a un entorno donde el rollback es difícil (mobile, embedded, on-prem)
- Tu suite de tests da verde para código que está visiblemente roto
La versión honesta: trunk-based sin feature flags es solo "rápido y frágil." Si todavía no puedes permitirte la infraestructura de flags, las release branches no son una regresión — son una señal honesta de lo que soporta tu tooling.
Release branches: el modelo entre trunk-based y GitFlow
main acumula trabajo mergeado. Con una cadencia (cada sprint, cada viernes,
cada mes), cortas una rama desde main — release/2024-11 — la estabilizas
con fixes, la despliegas y la etiquetas.
La ventaja: una superficie estable para probar y desplegar, separada del trabajo en curso. El coste: los cherry-picks. Cada fix que necesita ir a la rama de release es una decisión manual y una oportunidad de olvidarlo.
Este modelo encaja en equipos que:
- Despliegan a entornos con coste por tiempo de inactividad (pipelines de datos, sistemas batch)
- Tienen una etapa de QA que necesita un objetivo estable
- No pueden permitirse la inversión en feature flags que asume trunk-based
Los cherry-picks son donde este modelo se rompe. Si cherry-pickeas más de dos o tres fixes por release, tienes un problema diferente — o tus tests no detectan regresiones, o estás cortando demasiado pronto. No normalices el treadmill del cherry-pick.
GitFlow: el modelo con el techo más alto y el suelo más alto
Dos ramas de larga vida (main y develop), más feature/*, release/* y
hotfix/*. Vincent Driessen lo escribió en 2010 para software con releases
versionados explícitos — aplicaciones de escritorio, librerías, productos
on-prem.
Justifica su coste cuando:
- Distribuyes versiones discretas que los usuarios instalan (no servicios desplegados continuamente)
- Múltiples versiones conviven en producción simultáneamente y necesitan hotfixes separados
- Un entorno regulado requiere ramas explícitas de "esto es lo que desplegamos"
Es un impuesto sobre todo lo demás:
- Dos ramas de larga vida significa el doble de superficie de merge
- Cada feature cruza tres ramas antes de llegar a producción
- Los nuevos dedican una semana a aprender el proceso antes de que aterrice su primer PR
El propio Driessen añadió una nota al post original en 2020: "si estás construyendo software versionado explícitamente, GitFlow es genial. Si estás ejecutando una web app, casi seguro no quieres GitFlow." Úsalo a propósito, no por defecto.
Señales de que has superado tu modelo
Desde trunk-based
- Los feature flags superan en número a las features. Escribiste el flag, la feature, la eliminación del flag y la limpieza. El flag sigue ahí.
maines de solo lectura el día de release. Si desplegar requiere un freeze, tu afirmación de "siempre desplegable" es ficticia.- Un hotfix necesita tres revisores y una reunión. El modelo asume que puedes corregir hacia adelante rápido. Si no puedes, estás pagando el coste sin el beneficio.
Desde release branches
- Cherry-pickeas más de tres fixes por release. La estabilización se ha convertido en una rama paralela de trabajo.
- Existen dos release branches a la vez. Empezaste a solapar releases para mantener el ritmo y el coste se está duplicando.
- Nadie recuerda qué fix está en qué release. Haz seguimiento, o pasa a trunk-based.
Desde GitFlow
developymaindivergen durante semanas. Estás manteniendo dos realidades paralelas y el merge amaines ahora su propio proyecto.- Los hotfixes se saltan
develop. Luego alguien reintroduce el bug en el siguiente merge de feature. El modelo prometía que esto no pasaría. - No puedes explicar GitFlow a un nuevo miembro del equipo en 10 minutos. El coste de onboarding es parte del coste del modelo.
Elegir la estrategia de ramas de git correcta para tu equipo
Elige con intención, no por herencia. Vuelve a elegir cuando cambie el tamaño del equipo, la cadencia de entrega o el tooling — no cuando alguien del equipo encuentre un nuevo post de blog.
El modelo correcto es el cuyos costes puedes pagar este trimestre, con el tooling que realmente tienes. El modelo incorrecto es el que elegiste hace dos años y nunca revisaste.
Formato
| Parte | Obligatoria | Descripción |
|---|---|---|
tipo/ | Sí | Prefijo del tipo de cambio |
scope- | No | Módulo afectado (commits convencionales) |
123- | No | Número de issue |
descripción | Sí | Texto en kebab-case, máximo 50 caracteres |
Tipos de rama
| Prefijo | Uso |
|---|---|
feat/ | Nueva funcionalidad |
fix/ | Corrección de bug |
hotfix/ | Corrección urgente desde main o una rama de release |
release/ | Corte de estabilización antes del release |
chore/ | Configuración, CI, dependencias, tooling |
docs/ | Documentación o contenido |
refactor/ | Reestructuración sin cambio de comportamiento |
test/ | Tests sin cambio en código de producción |
Scope — commits convencionales
El scope identifica el módulo afectado. Va entre paréntesis en el commit asociado a la rama: tipo(scope): descripción.
| Rama | Commit correspondiente |
|---|---|
feat/auth-add-oauth | feat(auth): add OAuth login |
fix/api-null-response | fix(api): handle null user response |
chore/ci-upgrade-node | chore(ci): upgrade to Node 20 |
refactor/db-extract-queries | refactor(db): extract query layer |
El scope es opcional pero recomendado en proyectos con más de un área de responsabilidad clara.
Reglas
- Solo minúsculas
- Guiones como separador — no guiones bajos, no camelCase
- Máximo 50 caracteres tras la barra
- Sin nombres propios en la descripción
- Sin puntos ni barras al final
Ramas de larga vida
| Rama | Uso |
|---|---|
main | Siempre desplegable (todos los modelos) |
develop | Solo GitFlow — acumula features antes del release |
Ejemplos válidos
feat/auth-add-oauth-loginfix/api-null-response-handlerhotfix/checkout-null-pointerrelease/2024-11chore/ci-update-node-20docs/contributing-guiderefactor/db-extract-query-layertest/auth-integration-coverage