Um guia prático para um modelo de branching que respeita congelamentos de lançamento da loja - integração trunk-based em main, branches de recursos de curta duração e pistas de lançamento que não colidem com as janelas de revisão da App Store ou do Play.
Cartão de receita de referência rápida - pronto para copiar e colar.
# Daily feature workgit checkout main && git pull --ff-onlygit checkout -b feat/SHIP-412-checkout-summary# ... commits ...git push -u origin feat/SHIP-412-checkout-summary# Open PR → squash merge to main after review + CI green
# Release cut (Tuesday - before Thursday freeze)git checkout main && git pull --ff-onlygit checkout -b release/2.6.0git push -u origin release/2.6.0# Only bugfixes cherry-picked or PRs targeting release/2.6.0 until tag
# Tag after QA sign-off (post-review)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
Branch lanes (mobile) main ← integration; always green CI feat/* ← days, squash merge release/X.Y ← weeks; freeze during store review hotfix/X.Y.Z ← hours; from tag, cherry-pick to main ota/production ← optional long-lived for channel-only JS (see GitHub Flow page)
Quando usar isso:
Primeira equipe mobile a adotar Git após builds ad-hoc em laptop.
Janelas de submissão da loja onde mesclar recursos durante a revisão arrisca rejeição.
Coordenação de atualizações de JavaScript OTA com binários de loja marcados.
Integração de engenheiros que conhecem Git web, mas não disciplina de artefatos nativos.
Quando evitar:
Projeto paralelo solo sem QA ou cadência de loja - main + tags podem ser suficientes.
GitFlow com develop durando meses - a revisão da loja mobile pune o desvio.
PR tem como alvo main. Squash merge preserva um commit por recurso - cherry-picks mais fáceis para release/* depois.
Etapa 3 - Corte do branch de lançamento antes do congelamento
<!-- docs/release-calendar.md (excerpt) -->| Week | Event | Git rule ||------|--------------------------------|-----------------------------------|| W12 | Cut release/2.6.0 Tue 10:00 | New features → main only || W12 | Code freeze Thu 18:00 UTC | release/2.6.0: bugfixes only || W12 | Submit Fri after Maestro | Tag v2.6.0 from release branch || W13 | Store review in flight | No native changes on release/2.6.0|
Mesclar main em release/* durante a revisão - Puxa recursos não testados por QA; risco de rejeição da loja. Correção: Cherry-pick apenas SHAs listados.
Branch de recurso a partir de main desatualizado - Rebase antes do PR; conflitos de runtimeVersion desatualizados surgem tarde. Correção:git fetch && git rebase origin/main semanalmente.
Alvo de 1–3 dias. Branches mais longos entram em conflito com atualizações de versão de app.json, alterações em pastas nativas e edições de perfil EAS. Rebase ou mescle main diariamente.
Quais mesclagens são permitidas durante o congelamento de código?
Correções de bugs com evidências de QA, ajustes de cópia que não alteram o código nativo e patches de segurança. Sem novas telas, permissões ou módulos Expo - estes precisam de um novo binário de loja e reiniciam o relógio de revisão.
As atualizações OTA devem vir de branches main ou release?
Hotfixes apenas de JS na mesma runtimeVersion podem ser publicados de main para o canal de produção após um período de teste. Código vinculado à loja deve corresponder ao commit release/* marcado que o QA aprovou. Veja Canais e Branches de Lançamento.
Commit de merge ou squash merge?
Squash para feat/* → main - um ticket, um commit. Commit de merge opcional para release/* → main se você quiser preservar o limite de lançamento. Nunca faça squash de um branch de lançamento sem acordo da equipe - perde os SHAs de cherry-pick.
Como lidar com branches de atualização de SDK?
Use um branch de spike dedicado de longa duração ou git worktrees - não bloqueie main por duas semanas enquanto expo upgrade é executado.