| name | branching-strategy |
| description | Guide git branching strategies, branch naming, and merge/rebase decisions. Use when the user creates branches, asks about Git Flow vs trunk-based development, discusses merge vs rebase, or is setting up a new repository's branching model.
|
Branching Strategy
Choose and apply the right branching model for the project's size, team, and release cadence.
When to Use
- Creating a new branch for a feature, fix, or release
- Deciding between merge and rebase
- Setting up a new repository's branching conventions
- Discussing release management and deployment strategies
- Resolving merge conflicts or untangling branch history
Core Patterns
Branch Naming Conventions
Use a consistent prefix/slug format:
feature/AUTH-123-add-sso-login
fix/BUG-456-null-pointer-on-logout
refactor/TECH-789-extract-auth-service
hotfix/SEC-101-patch-xss-vulnerability
release/v2.3.0
chore/TECH-202-upgrade-node-20
feature/add-user-registration
fix/prevent-race-condition-in-cache
Rules:
- Lowercase with hyphens (kebab-case)
- Keep under 50 characters after the prefix
- Include ticket ID when available
- Use descriptive slugs, not cryptic abbreviations
Git Flow (Structured Releases)
Best for: projects with scheduled releases, multiple environments, or compliance requirements.
main โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ (production)
\ /
release/v2.1 โโโโโโโโโโโโโ (stabilization)
/ \
develop โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ (integration)
\ / \
feature/x โโโโโโโ \
\
feature/y โโโโโโโ
git checkout develop
git checkout -b feature/AUTH-123-add-sso
git checkout develop
git merge --no-ff feature/AUTH-123-add-sso
git branch -d feature/AUTH-123-add-sso
git checkout develop
git checkout -b release/v2.1.0
git checkout main
git merge --no-ff release/v2.1.0
git tag -a v2.1.0 -m "Release v2.1.0"
git checkout develop
git merge --no-ff release/v2.1.0
git checkout main
git checkout -b hotfix/SEC-101-patch-xss
git checkout main
git merge --no-ff hotfix/SEC-101-patch-xss
git tag -a v2.1.1 -m "Hotfix v2.1.1"
git checkout develop
git merge --no-ff hotfix/SEC-101-patch-xss
Trunk-Based Development (Continuous Delivery)
Best for: small teams, CI/CD pipelines, frequent deployments.
main โโโโโโโโโโโโโโโโโโโโโโโโโโโโโ (always deployable)
\ / \ / \ /
โโโ โโโ โโโ (short-lived branches, <2 days)
git checkout main
git pull --rebase origin main
git checkout -b feature/add-search
git fetch origin
git rebase origin/main
git checkout main
git merge --no-ff feature/add-search
git push origin main
Key rules for trunk-based:
- Branches live less than 2 days
- Feature flags for incomplete work
- Main is always deployable
- No long-lived branches except main
Merge vs Rebase Decision
git checkout feature/my-work
git rebase main
git checkout main
git merge --no-ff feature/my-work
git checkout main
git merge --no-ff feature/my-work
git checkout main
git merge --squash feature/my-work
git commit -m "feat: add search functionality"
| Strategy | When to Use | Trade-off |
|---|
| Merge | Shared branches, preserving history | Noisy log, but full context |
| Rebase | Local cleanup, linear history | Clean log, rewrites history |
| Squash | Messy PR history, single logical unit | Cleanest log, loses details |
Golden rule: Never rebase commits that have been pushed to a shared branch.
Anti-Patterns
What NOT to Do
- Long-lived feature branches: Branches open for weeks accumulate merge conflicts and drift from main. Keep branches short-lived.
- Committing directly to main: Even solo developers benefit from branch-based workflow for rollback safety.
- Rebasing shared branches: Rewriting history on branches others work on causes lost commits and confusion.
- Inconsistent naming: Mixing
feature/, feat/, Feature/, and no prefix makes automation and filtering impossible.
- No branch protection: Main/develop should require PR reviews and CI checks. Never force-push to protected branches.
git checkout main
git commit -m "feat: add new feature"
git push
git checkout develop
git rebase main
git checkout -b feature/add-search
Quick Reference
Branch Naming:
feature/<ticket>-<description>
fix/<ticket>-<description>
hotfix/<ticket>-<description>
release/v<semver>
chore/<ticket>-<description>
Strategy Selection:
Scheduled releases + multiple envs -> Git Flow
Continuous delivery + small team -> Trunk-based
Open source + many contributors -> GitHub Flow (fork + PR)
Merge Strategy:
Local cleanup -> rebase then merge --no-ff
Shared branch -> merge --no-ff (never rebase)
Messy PR commits -> squash merge
Rules:
- Never rebase public/shared branches
- Never force-push to main or develop
- Keep feature branches under 2 days (trunk-based)
- Always use --no-ff for merge commits (preserves branch history)
- Delete branches after merging