100% Free Forever
AI-Powered Learning
Industry Expert Content
Certificates & Badges
Learn At Your Own Pace
Bash

Feature Branch Workflow

A widely used team workflow where every change lives on its own short-lived branch off main, gets reviewed via pull request, and is merged once approved and tested.

Collaboration WorkflowsIntermediate8 min readJul 9, 2026
Analogies

Feature Branch Workflow

The feature branch workflow is less a Git feature and more a convention teams adopt on top of ordinary branching and merging. The core rule is simple: main (or master, or trunk) always represents working, deployable code, and no one commits to it directly. Every unit of work — a new feature, a bug fix, a chore — gets its own branch created from the latest main, named descriptively, and worked on in isolation. When the work is done, the branch is pushed and opened as a pull request; only after review and passing checks does it get merged back into main. This isolates in-progress, potentially broken code from the branch everyone else builds on and deploys from, and it gives every change a natural checkpoint for review.

🏏

Cricket analogy: Like keeping the Test XI's main squad list untouched until a player proves themselves in domestic cricket first — Virat Kohli's spot on main stays secure while a young batter like Yashasvi Jaiswal builds his case on a separate net-session track before selectors merge him in.

Branch naming and scope

Most teams standardize a naming scheme such as feature/<short-description>, fix/<short-description>, or <ticket-id>-<short-description> (e.g. PROJ-482-rate-limiting) so that branch lists and CI dashboards are self-explanatory at a glance. Scope discipline matters as much as naming: a feature branch should correspond to one reviewable unit of work. Branches that live for weeks and accumulate unrelated commits become painful to review and prone to conflicts, which is why the workflow is often paired with the advice to keep branches short-lived — ideally merged within days, not weeks.

🏏

Cricket analogy: Like labeling net sessions by purpose — "spin-practice-Ashwin" or "yorker-drill-Bumrah" — so the coaching staff knows at a glance what each session covers, and keeping each session focused on one skill rather than dragging on for a whole season.

bash
# Start a new feature branch from an up-to-date main
git checkout main
git pull origin main
git checkout -b feature/csv-export

# Work, commit incrementally
git add src/export/csv_writer.py
git commit -m "Add streaming CSV writer for large export jobs"

# Keep the branch current with main as it moves
git fetch origin
git rebase origin/main

# Push and open for review
git push -u origin feature/csv-export

# After merge, clean up locally
git checkout main
git pull origin main
git branch -d feature/csv-export

Keeping branches in sync

The longer a feature branch diverges from main, the more likely it collides with other people's merged work. Two strategies address this: periodically merging main into the feature branch (safe, but adds merge commits to the branch's history) or rebasing the feature branch onto main (rewrites the branch's commits on top of the latest main, producing a cleaner linear history but requiring a force-push since the branch's history changed). Teams typically pick one convention and apply it consistently; rebasing is common for solo feature branches that haven't been shared, while merging is safer once collaborators are also pushing to the same branch.

🏏

Cricket analogy: Like a batsman periodically checking the scoreboard and adjusting his running between wickets (merging) versus a captain redoing the entire batting order fresh each innings for a cleaner strategy (rebasing), which only works if the order hasn't been announced to the opposition yet.

The feature branch workflow scales down to solo projects and up to large teams unchanged — the only thing that grows is the sophistication of the review and CI gates attached to the pull request step, not the branching model itself.

Rebasing a feature branch that other collaborators have already pulled and built on top of rewrites shared history; anyone who pulled the old commits will get confusing duplicate commits or conflicts. Only rebase branches that are effectively yours alone, or coordinate explicitly first.

  • Main always stays deployable; all work happens on branches created from it.
  • Descriptive, consistent branch names (feature/, fix/, ticket-id-based) make history and CI dashboards self-explanatory.
  • Short-lived, narrowly scoped branches are far easier to review and merge than long-running sprawling ones.
  • Syncing a feature branch with main can be done via merge (safe for shared branches) or rebase (cleaner history, requires force-push).
  • The workflow pairs naturally with pull requests as the review and merge gate.
  • Never rebase a branch that collaborators have already pulled without coordinating first.

Practice what you learned

Was this page helpful?

Topics covered

#Bash#GitVersionControlStudyNotes#SoftwareEngineering#FeatureBranchWorkflow#Feature#Branch#Workflow#Naming#Git#StudyNotes#SkillVeris