Oh wiki. You lie! We actually have merge problems much less than when we used SVN.
Here’s what’s great about DVCS. Our workflow is actually very similar to our SVN workflow, with a definitive master branch that we release from.
Why is it so much better? Because we can release features a lot faster. Why? We have more granular checkins and we have better code isolation.
Here’s how it’s set up, and why we’re much more agile now:
We have a central ‘trunk’ branch from which we deploy. Each developer has a copy of that master branch on their own machine, bound in lockstep to the master branch (a checkout in bzr terms)—meaning that in order to check in a change to the master branch, you need to be up-to-date (exactly the same as SVN).
Whenever one of us works on a new feature (no matter how small!), we simply branch a copy of the tree (locally), check into it until it’s stable, then merge back into our local copy. We run tests, then upload to the master tree.
Yippee doo, you say, doesn’t seem like a big thing. But when we used SVN, say I found a bug or a high priority fix. If i was in the middle of a new feature, oh, crap, I was out of luck. I could create an SVN branch, but that took some time and work and was a pain to merge back into trunk.
With bzr, I can simply make a quick branch, work on the feature, then merge back into trunk. Done. I don’t have to worry about cleaning up my local code.
Beyond, that, though, is the benefit of having a local checkout. Why is that great? Because you don’t have to wait until things are stable to do a checkin. Because my local checkins don’t affect other developers, I have an incentive to do a bunch of checkins—and I feel much better about developing because I get that positive reinforcement of small steps. If you’re using SVN, you end up waiting to checkin because you don’t want to break trunk.
I had no idea how much of a benefit it would be when we switched—I thought it would be a neat experiment. But after using bzr, I will never ever ever ever go back to SVN.