A cookbook for GitHub Flow adapted to mobile - continuous integration on main, release branches for store trains, and hotfix branches parallel to OTA channels so production JavaScript and live store binaries stay aligned.
GitHub Flow (mobile adaptation) 1. Branch from main → feat/SHIP-220-dark-mode 2. Open PR → CI + device evidence required 3. Merge to main → squash preferred 4. Deploy → OTA to preview channel OR tag for store build
# Hotfix for live store version 2.4.x (parallel to 2.5 RC on release/2.5.0)git fetch --tagsgit checkout -b hotfix/2.4.2 v2.4.1git cherry-pick <fix-sha>git tag -a v2.4.2 -m "Hotfix: crash on cold start [SHIP-991]"git push origin hotfix/2.4.2 v2.4.2
# JS-only hotfix on same runtimeVersion - OTA from hotfix branchgit checkout hotfix/2.4.2eas update --branch production --channel production --environment production \ --message "hotfix: cold start crash [SHIP-991]"
Parallel lanes example main ← integration release/2.5.0 ← RC in TestFlight review hotfix/2.4.2 ← production store 2.4.x users (OTA production channel ← hotfix/2.4.2 commits only)
When to reach for this:
Users on two store versions simultaneously (staged rollout lag).
OTA production channel must not receive commits meant for next store release.
Team outgrows "tag everything from main" but does not want GitFlow develop.
Hotfix needed while release/2.5.0 is frozen in App Review.
When to avoid:
Single version in market, OTA disabled - simpler trunk + tags may suffice.
Hotfix requires new native module - must be store build, not OTA-only lane.
OTA from main while 2.4 and 2.5 differ in native code - 2.5 binary may load incompatible JS. Fix: Publish production OTA only from hotfix/* tied to live runtimeVersion.
Hotfix branch from release/2.5.0 for 2.4 users - Wrong native baseline. Fix:git checkout -b hotfix/2.4.2 v2.4.1.
Forgetting cherry-pick to release/2.5.0 - Fix ships to old users only; 2.5 regresses. Fix: Backport checklist in PR template.
Deleting hotfix branch before channel repoint - Production channel orphaned. Fix:eas channel:edit only after new tag lane documented.
Parallel hotfixes same version - Second branch from wrong tag. Fix: Sequential tags v2.4.2, v2.4.3; one open hotfix at a time per major.minor.
For small apps with continuous store submission - often yes. Add release/* when review windows, RC soak, or parallel versions demand a frozen candidate branch.
How many hotfix branches can be open?
One per live store minor (e.g. one hotfix/2.4.x lane). Multiple patches chain as v2.4.2, v2.4.3. A separate hotfix/2.3.x only if you still support that cohort.
Does hotfix merge to main or only cherry-pick?
Fix lands on main via normal PR first. Hotfix branch cherry-picks that SHA - never merge hotfix → main (brings version bump noise backward).
Who owns production OTA publishes?
CI on tag or release manager with EXPO_TOKEN - not feature developers from laptops. Matches Release Train Calendar policy.
What if hotfix needs native code?
Store build from hotfix/*, new tag, expedited submit - OTA alone is insufficient. Bump runtimeVersion if native ABI changes (Runtime Version Policy).