Workflows
Sync Boundaries on Shared Branches
Define what is safe and unsafe on a branch shared by multiple people so sync stays predictable and history rewrites do not turn into team-wide incidents.
- Teams turning commands into repeatable routines
- Readers who need sequencing, branch, and sync discipline
- Basic understanding of fetch, pull, push, and branches
- A sense of how and why branches diverge
- Copying a workflow without checking branch state
- Choosing the wrong integration path on shared branches
Once multiple people depend on the same branch, actions that feel harmless on a personal branch can become destructive at team scale.
On a solo branch, rebase and reset may be cleanup. On a shared branch, they may change the synchronization baseline for everyone else.
Why shared branches are different
The defining property of a shared branch is not only “many people use it.” It is that other people depend on the history expression you are looking at right now.
If you rewrite that expression, you are not only changing your own branch view. You are changing other people’s sync base.
That is why shared-branch mistakes often become coordination incidents rather than personal mistakes.
A useful rule
Prioritize “everyone can sync safely” over “history looks maximally tidy.”
This rule directly reduces:
- surprise divergence after pull
- confusion around CI, tags, and release context
- recovery complexity after branch accidents
Which actions usually stay inside the safer boundary
Usually acceptable
git fetchgit pull --ff-only- explicit merge
- deliberate review-driven merge actions
The common property is that they mostly append history or at least avoid silently rewriting history other people already depend on.
Use with serious care
- rebasing a shared branch
- reordering commits that teammates already saw
- changing upstream or branch shape without coordination
These are not always forbidden, but they should never be casual.
Normally avoid
- unannounced force-push
- reset-based shared-history rewrites
- treating a shared branch like a personal cleanup area
Why this boundary is healthier
Shared branches are not optimized for one person’s history preferences. They are optimized for team-wide predictability.
If every contributor assumes “I’ll tidy this up and others can just pull again,” the result is usually not better history. It is higher coordination cost.
The technical command is only part of the issue. The more dangerous part is that others may not know their synchronization base has changed. Shared-branch failures are often expectation failures first and command failures second.
Not all shared branches carry the same risk
Main or default branch
Usually the highest-risk branch.
It should normally accept only protected, deliberate integrations.
Release branch
Also high risk, because it often maps to deployment state, tags, release notes, or support expectations. Casual history rewriting is especially dangerous here.
Multi-person feature branch
Lower risk than main, but still no longer a personal branch. If several people depend on it, history cleanup should not be casual.
A lightweight team baseline
- clearly name which branches count as shared
- avoid private rebase and force-push on shared branches by default
- fetch before integration decisions
- if history rewrite is truly necessary, coordinate it explicitly
- treat main and release branches more conservatively than ordinary team branches
Common mistakes
Treating a shared branch like a personal branch
This is the most common and expensive mistake.
“I only rewrote a little history; everyone can pull again”
That assumes teammates understand what changed and how to recover cleanly, which is often false.
Applying one risk model to every shared branch
Main, release, and multi-person feature branches do not all deserve identical rules.
- Am I the only person depending on this branch?
- Does this action append history or rewrite it?
- If a teammate syncs right now, will this action surprise or break their flow?
Good follow-up reads
Fetch vs pullPR merge strategy and platform settingsMerge queue workflow