Let’s talk about DVCS
b-list.org
b-list.org
The flexibility, of course, allows you to use a distributed version system exactly the way you would with a centralized one.
Yes, Rails still uses a 'central' development model. But it's trivial for me to fork Rails then track development, add my own features, fix bugs, or go my own route with a personal or corporate version of the framework. Many people do this. Rails has almost 300 forks on GitHub alone. In fact, every time you `git clone` Rails you fork it.
If someone has stopped maintaining a small library, you can fork it and take over. It's now your library. Others can pull down your changes and watch your development.
If you don't like the direction someone is taking their library, you can fork it and head a new direction. And the two tracks can live in harmony. You can even take changes you do like from the original library and merge them into yours with ease.
These things happen all the time and are possible with a DVCS because of the opinions (or rather, lack of opinions) present in software like Git. Yes, you can add this stuff to Subversion - add offline committing, use shas instead of revision #s, enable inline branching - but as soon as you do Subversion becomes a DVCS.
For me, it's always been about the social aspect of DVCS. That is the interesting part. The technical awesomeness is icing on the cake.
Learning git or hg as cvs/svn++ is REALLY bad. I've personally lived through Flock using hg for several months only to abandon it for SVN (hg was version 0.6 and would eat our commits...) I've also had to help friends at companies who jumped on git without knowing how to use it, and hearing horror stories about everyone rebasing/rewriting history combined with a central repo.
Honestly it makes me not promote git as much since I don't want to deal with the "svn++" mentality.
Whether you realize it or not, if you've got a group of a thousand developers and you say "let's keep our code in Subversion" (or ClearCase, or... etc.), you've just made a whole host of decisions about how the individual project teams are going to collaborate with one another.
Distributed version control systems let you consciously decide what the workflow will be between project teams, and this hasn't been possible before.
As mentioned in the article, what are these choices? What EXACTLY changes about the way teams will collaborate? This seems to be his real question...
Here's a relevant quote from the article:
In Windows, this [centralised] model breaks down simply
because there are far too many developers to access one
central repository. So Windows has a tree of
repositories: developers check in to the nodes, and
periodically the changes in the nodes are integrated up
one level in the hierarchy. At a different periodicity,
changes are integrated down the tree from the root to the
nodes. In Windows, the node I was working on was 4 levels
removed from the root. The periodicity of integration
decayed exponentially and unpredictably as you approached
the root so it ended up that it took between 1 and 3
months for my code to get to the root node, and some
multiple of that for it to reach the other nodes. It should
be noted too that the only common ancestor that my team,
the shell team, and the kernel team shared was the root.
With a distributed system, it would be possible to send changes directly between the two groups. You might have a problem keeping the whole Windows source code repository stored locally on your development machine though.Support for network structures besides "central server with commit haves and have-nots" greatly reduces the amount of inherent politics and the seriousness of forks.
Every repository is a full backup, and could become a new primary server if necessary. Even if you still use a "commit to central server" network structure, this comes in handy.
http://betterexplained.com/articles/intro-to-distributed-ver...
Pros: Everyone has a local sandbox, works offline, fast, great change tracking, easy branches/merges, less software setup
Cons: no "revision" by default (ugly change guids), no central "always-on" location by default