Un libro de recetas para un modelo de ramificación que respeta las congelaciones de lanzamiento de tienda - integración basada en troncales en main, ramas de características de corta duración y carriles de lanzamiento que no chocan con las ventanas de revisión de App Store o Play.
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
# Trabajo diario de característicasgit checkout main && git pull --ff-onlygit checkout -b feat/SHIP-412-checkout-summary# ... commits ...git push -u origin feat/SHIP-412-checkout-summary# Abre una PR - fusión con squash a main después de revisión + CI verde
# Corte de lanzamiento (martes - antes de congelación del jueves)git checkout main && git pull --ff-onlygit checkout -b release/2.6.0git push -u origin release/2.6.0# Solo correcciones cherry-picked o PRs dirigidas a release/2.6.0 hasta tag
# Tag después de la aprobación de QA (post-revisión)git checkout release/2.6.0git tag -a v2.6.0 -m "Release 2.6.0 - build_id abc123"git push origin v2.6.0
Carriles de rama (móvil) main - integración; CI siempre verde feat/* - días, fusión con squash release/X.Y - semanas; congelada durante revisión de tienda hotfix/X.Y.Z - horas; desde tag, cherry-pick a main ota/production - opcional larga vida para solo JS de canal (ver página GitHub Flow)
Cuándo usar esto:
Primer equipo móvil que adopta Git después de compilaciones ad-hoc en laptops.
Ventanas de envío a tienda donde fusionar características durante revisión riesga el rechazo.
Coordinar actualizaciones JavaScript de OTA con binarios de tienda etiquetados.
Incorporar ingenieros que conocen Git web pero no la disciplina de artefactos nativos.
Cuándo evitarlo:
Proyecto secundario en solitario sin QA o cadencia de tienda - main + tags puede ser suficiente.
GitFlow con develop durando meses - la revisión de tienda móvil castiga el desplazamiento.
# .gitignore - esenciales móviles (NO ignores el lockfile)node_modules/.expo/dist/*.jks*.p8*.p12*.mobileprovisionios/Pods/android/.gradle/android/app/build/
La PR apunta a main. La fusión con squash preserva un commit por característica - cherry-picks más fáciles a release/* después.
Paso 3 - Cortar rama de lanzamiento antes de congelación
<!-- docs/release-calendar.md (fragmento) -->| Semana | Evento | Regla de Git ||--------|-----------------------------------|-----------------------------------|| W12 | Corte release/2.6.0 Mar 10:00 | Nuevas características - solo main|| W12 | Congelación de código Jue 18:00 UTC | release/2.6.0: solo correcciones || W12 | Envío Vie después Maestro | Tag v2.6.0 desde rama de lanzamiento || W13 | Revisión de tienda en vuelo | Sin cambios nativos en release/2.6.0 |
Fusión de main en release/* durante revisión - Incorpora características sin QA; riesgo de rechazo de tienda. Solución: Cherry-pick solo SHAs listados.
Rama de características desde main desactualizado - Rebase antes de PR; conflictos de runtimeVersion desactualizado surgen tarde. Solución:git fetch && git rebase origin/main semanalmente.
¿Cuánto tiempo deben vivir las ramas de características?
Objetivo 1-3 días. Ramas más largas entran en conflicto con bumps de versión de app.json, cambios en carpetas nativas y ediciones de perfil de EAS. Rebase o fusiona main diariamente.
¿Qué fusiones se permiten durante congelación de código?
Correcciones con evidencia de QA, cambios de copia que no alteran código nativo y parches de seguridad. Sin nuevas pantallas, permisos o módulos de Expo - esos necesitan un nuevo binario de tienda y reloj de revisión de reinicio.
¿Deberían venir actualizaciones de OTA desde ramas main o release?
Hotfixes solo de JS en la misma runtimeVersion pueden publicar desde main al canal de producción después de remojo. Código vinculado a tienda debe coincidir con el commit de release/* etiquetado que QA aprobó. Ver Release Channels & Branches.
¿Fusión de commit o squash merge?
Squash para feat/* - main - un ticket, un commit. Merge commit opcional para release/* - main si quieres preservar límite de lanzamiento. Nunca hagas squash de rama de lanzamiento sin acuerdo de equipo - pierde SHAs de cherry-pick.
¿Cómo manejo ramas de actualización de SDK?
Usa una rama de spike dedicada de larga vida o git worktrees - no bloquees main durante dos semanas mientras expo upgrade se ejecuta.