At first glance DVCS
(i.e. Git, BitKeeper, Mercurial, Baazar, etc) main advantage seems related to better branching and merging. Especially for those who experienced the pain of big merge-conflicts of long lived branches (*) with a traditional VCS
(i.e. SVN, Perforce, TFVC, etc).
In reality DVCS born to serve distributed remote teams
. This is the main point
, the distinctive characteristics originate from it and this is why DVCS can do that with simplicity and flexibility.
Here are 2 key distinctive characteristics of DVCS:
- Connection disruptions: when the connection between 2 remote teams goes down, each team member can continue to work autonomously as usual (**) because has the local full copy of the repository including the whole history and everything else that is needed to be autonomous and fully operative locally
- Repository disruptions:
- when a problem affect the central repository: a problem can affect the centralized repository and who can fix the problem is not reachable/available (i.e. because is working in a very different time-zone). Again with DVCS each team member have a self-contained first-class full copy of the repository that make him/her fully operative locally.
- when a remote commit broke the build: a remote team member can commit code with problems (i.e. broke the build, cause merge conflicts, etc) and then go offline, can be not immediately reachable/available (i.e. because is working in a very different time-zone). DVCS enable mechanisms like i.e. the 1-click pull-requests that give a way to deal well with this kind of problems.
A 3dr key distinctive characteristic of DVCS is specifically related to open-source projects:
- Anyone is enabled to and can easily fork a repository to fix a bug or add a feature, and then make a pull-request. This enable and support the spontaneous formations of teams around the open-source project.
All this is explained and expanded in chapters 3 and 14 of the book Continuous Delivery, Addison Wesley.
How are you taking advantage or your DVCS? Are you exploiting the 3 key distinctive characteristics?
Are you exploiting it in other unconventional creative ways?
(*) A root cause for the pain of merging long lived branches is related to the fact that the probability of merge conflict grows faster then linear (polynomially/exponentially depending on the structure of the code-base) with the lifetime of the branch.
Another root cause is that the most difficult merge-conflicts require semantic diff and merging while the main diff and merge tools are text based.
None of these root causes are currently addressed directly by the DVCS.
(**) The impact of a connectivity disruption to Continuous Integration servers and i.e. Tests environments is not automatically resolved by the DVCS. A DVCS enable to easily setup a local autonomous CI environment to continue to work locally until the connectivity is restored.