Friday afternoon, the sixth deploy of the day is going to prod. A hotfix taken from the release/2026.05 branch collides with the previous hotfix as it’s merged back into develop. A three-person channel opens, ten minutes of talk, and nobody stops to think “this is actually a trivial conflict” — because it’s the fourth one this week.
If the scene feels familiar, your branching strategy can’t keep up with your deploy cadence.
Trunk-based, in one sentence
A single long-lived branch (main or trunk), feature branches whose lifespan is measured in hours — two days at most — and a cadence where every merge is kept green enough to ship to prod. Unfinished features live in the code and are exposed to users behind a feature flag.
Nothing more — no release/* branch, no develop branch, no long-lived branches tied to a version number.
What “high frequency” means
It’s meaningless without being concrete: the projects where I argue for trunk-based all share one trait — 3 to 10 deploys a day. A team that deploys once a week has no compelling reason to move to trunk-based; Gitflow or GitHub Flow works fine at that rhythm.
For me the threshold is clear: once deploy frequency hits 5+ per week, the release branch stops being “order” and starts being an obstacle.
Why the release branch breaks at high frequency
Three real mechanisms:
- Merge friction doesn’t grow linearly. The longer two branches live side by side, the higher the chance of conflict, every day. In a weekly release cycle this stays invisible; in a daily cycle every merge is a small drama.
- The hotfix path creates a parallel history.
hotfix/*→main→ ported back todevelop. Forgetting that port is the single most common source of prod bugs; at high frequency, never forgetting is statistically impossible. - The distance between review and deploy widens. If there are days between the moment a PR is “merged” and the moment it lands in prod, code review is actually evaluating a staging environment, not prod. The two environments are not the same thing.
The real cost of this workflow: discipline
Trunk-based isn’t “let’s delete branches.” It’s a discipline that binds a piece of code’s journey from birth to retirement — the software lifecycle — to a tighter cadence. Trunk-based without that discipline just means a prod that breaks faster.
Don’t try it without these:
- A green trunk, at the contract level. A broken trunk = the moment everyone is blocked. Without CI that guarantees this (a fast, reliable test pyramid + mandatory PR checks), trunk-based is a fantasy.
- Feature flag infrastructure. Half-finished features entering the code while staying closed to users is the foundation of this model. From a boolean flag to profile-based rollout, a feature flag discipline is mandatory.
- A fast pipeline. If it takes 30 minutes from merge to prod, the claim that “every merge can ship to prod” is theoretical. The 5–10 minute range is the practical threshold.
- A short-lived branch culture. Merging a PR after 4 days isn’t trunk-based, it’s Gitflow in disguise. A branch should close the day it opens, or the next day.
If these four aren’t in place, forcing trunk-based on a team doesn’t speed up prod — it only speeds up prod incidents.
You’ll hear “code review slows you down”
It doesn’t slow you down, it breaks the work into pieces. Trunk-based PRs are small by design — 200 to 400 lines, a single logical change. At that size a review takes 15 minutes. Anyone who knows that nobody actually reads a 2,000-line PR will see the real gain in moving to small PRs.
A small PR plus a feature flag separates “is this feature visible in prod” from “does this code compile in prod.” They’re two different decisions; trunk-based forces the distinction.
The cases where I don’t switch
The same checklist applies in reverse. The scenes where I don’t move to trunk-based:
- Mandatory pre-prod sign-off in a regulated industry. If a release has to pass a compliance gate, the release branch is a legal requirement, not a technical one. Trunk-based can’t carry it.
- Maintaining parallel versions. If 3.x and 4.x have to be supported at the same time — a packaged product, an SDK, an on-prem distribution — Gitflow’s version line is the natural answer.
- No CI maturity. Trunk-based dumps the cost of a broken main branch onto the team. On a team that can’t guarantee a green CI, that cost is paid as 1–2 hours of wasted time a day.
- A team smaller than 3, deploying once a week. The investment doesn’t pay off; your current pain isn’t solved by trunk-based because it doesn’t exist in the first place.
The metrics I use to measure the switch
“It’s going well” can’t be a hypothesis, it has to be measured. I read whether trunk-based is working from these three metrics:
- Lead time for changes — the p50 time from commit to prod. My target is < 1 hour.
- Change failure rate — what percentage of changes shipped to prod require a rollback or hotfix. My target is < 15%.
- Mean time to restore — how many minutes it takes to fix something that broke. My target is < 30 minutes.
If these three start going the wrong way, before abandoning trunk-based I review the CI and flag discipline — the cause is almost always there.
A workflow alone isn’t a silver bullet
Trunk-based, Gitflow, or GitHub Flow — none of them fixes your prod on its own. In production, branching strategy, code review cadence, deploy automation, and rollback readiness are a whole that works together. I compiled the practical side of that whole earlier in Git in Production: A Senior’s Practical Guide; trunk-based is the end of that picture where the cadence is fastest.
To decide where you fall between the two extremes, I covered the choice between Gitflow and GitHub Flow in a separate post.
Trunk-based isn’t a tool, it’s a cadence decision. Whatever rhythm your deploy frequency settles into, your workflow should settle there too — not the other way around.
Choose your workflow by prod’s pulse, not by fashion.