▶ Watch this video on YouTube (opens in a new tab)
The single-team sprint branch model is clean. One team, one branch, one merge to main. Nobody's stepping on anybody.
Then a second team shows up on the same codebase, shipping in the same iteration, and suddenly merges feel like a contact sport. The instinct is to blame Git — branch protection, merge order, who broke main this time.
But that's the misdiagnosis. This isn't a Git problem. It's a coordination problem. And it all comes down to one question: where is your integration point?
There are really two answers. Either each team gets its own branch and merges to main independently — main is where everyone meets. Or you put a shared iteration branch in the middle, and teams come together there before anything touches main.
Which one's right depends less on tooling and more on how coupled your teams actually are. Loosely coupled? Keep it simple. Tightly coupled and shipping as a unit? You want the safety net.
The video walks through both with diagrams, plus the ground rules and the mistakes I keep seeing teams make.