I did not yet work with hg or bazaar, but I had to learn git in my current project. While the switch was pretty complicated in the first two or three weeks, I learned to love the system of git. As far as I understand, hg / bazaar follow a similar concept.
Probably I should mention something of my current project. We are currently about 50 developers, some of them being "integrators" for different components, and one that integrates the whole product.
We often develop different features at a time and "merge" the stuff afterwards.
One (pretty much simplified) example:
One group needs to port the software to 64bit, another group needs to switch from IPv4 to IPv6. In the meantime, the "normal" development (bugfixing etc) continues.
So team A (64bit) has the following view:
master --> 64bit-branch (lots of commits in there)
while team B has
master --> ipv6-branch (also lots of commits in there)
Then again, you have lots of users that provide patches for bugs:
master --> bug-xxx-branch
Note, that the "master" branches from above must not necessarily be identical for the three groups, but I think you'll get the point.
The larger works (e.g. ipv6) is divided into different sub-topics, e.g.
- add IPv6 support to general network communication
- implement IPv6 support to SNMP
- add IPv6 support to whatever kind of communication (e.g. SIP in my example)
Those sub-topics are generally left to a single developer or a pretty small team of two or three people at maximum.
Every user has his own local repository (where he can create branches as he wants to)
Every team has a shared repository (commonly the repo of the team leader), where he will put the sources he wants to share with the team members
Team leaders need to integrate the sources of the people into one single branch (e.g. by rebasing or merging, depending on the situation)
If the work is done, the new "master-ipv6" (or whatever branch) is then sent to the integrator, who makes the final decision, whether this is going into the release.
The IPv6 example already shows the major difference. I cannot think of an (easy) solution to give away subprojects to multiple developers. You can achieve similar results by creating patches for every commit and then hope, that the integrator (or the team members) can apply the patches in their repository.
You also could create a IPv6-WIP branch on SVN, but this is still harder to maintain, as commits will end up pretty much mixed, and every developer has to rebase his stuff every time a new commit is done.
From my point of view, it's already getting complicated, when you try to share sources between three different people working on the same subject. As everyone creates his own commits, the commit order will in most cases be somewhat different.
Another example is the latest development for animations, that (imho) would be pretty much easier with a decentralized vcs. The current way (distribute patches via the forum) isn't the best way to share sources. You always need to download a file and apply it to your downloaded sources. If you're working on something else in the meantime, it's pretty hard to separate "your" changes from "their" changes. With git, this is done with just a single command.
You create two development branches (your working branch and the animation branch), and probably create a third "latest" branch, with as well your development topic branch as the animation branch merged into. You also can always merge the latest fixes from the 7.2 development branch.
So you can use as well your modifications as the animation stuff in your own testing environment, but still have your modifications within a single branch, which you can roll out to CE. Found a bug in CEGUI? No problem, create a new branch, fix it and send it to CE - based on the latest 7.x development branch. Oops, this bug is already in 7.1? Found a bug in the animation source? Create a animation-fixbranch, put your changes there and send it to the animations developer - based on HIS latest work.
Yeah, you can also merge branches within SVN and you always could create as many branches as you want to, but it's a PITA (at least it was with cvs). Plus you have to do it on the (centralized) server and cannot create your personal development environment.
Another big thing is the speed. I took hours to clone the whole SVN repository to my private git server. It only took me a couple of minutes to transfer the git repository to my local machine and it takes less than a second to switch to another branch.
SVN is still great if you only have a couple of developers, but if you expect more and more people to help out with patches or new ideas, a decentralized versioning control system is the way to go.
If you want to stay with SVN, this is still fine for me - I always can work with my local git repository (see the git-svn comment above), and can create patches from my local branches. Working with SVN is perfect, if you just want to download the "latest and greatest" (which would be the 'master' branch in git), but accessing different features that are currently in progress AND working on something else in the meantime isn't very comfortable - expect I missed some hidden SVN features