I've heard that many of the distributed VCSs (git, mercurial, etc) are better at merging than traditional ones like Subversion. What does this mean? What sort of things do they do to make merging better? Could those things be done in a traditional VCS?
Bonus question: does SVN 1.5's merge-tracking level the playing field at all?
In version control, merging (also called integration) is a fundamental operation that reconciles multiple changes made to a version-controlled collection of files. Most often, it is necessary when a file is modified on two independent branches and subsequently merged.
Benefits of version control systems. Using version control software is a best practice for high performing software and DevOps teams. Version control also helps developers move faster and allows software teams to preserve efficiency and agility as the team scales to include more developers.
DVCS is faster than CVCS because you don't need to communicate with the remote server for each and every command. You do everything locally which gives you the benefit to work faster than CVCS. Working on branches is easy in DVCS.
SVN's merging capabilities are decent, and the simple merging scenarios work fine - e.g. release branch and trunk, where trunk tracks the commits on the RB.
More complex scenarios get complicated fast. For example lets start with a stable branch (stable
) and trunk
.
You want to demo a new feature, and prefer to base it on stable
as it's, well, more stable than trunk
, but you want all your commits to be propagated to trunk
as well, while the rest of the developers are still fixing things in stable
and developing things on trunk
.
So you create a demo
branch, and the merging graph looks like:
stable -> demo -> trunk
(you)stable -> trunk
(other developers)But what happens when you merge changes from stable
into demo
, then merge demo
to trunk
, while all the time other developers are also merging stable
into trunk
? SVN gets confused with the merges from stable
being merged twice into trunk
.
There are ways around this, but with git/Bazaar/Mercurial this simply doesn't happen - they realize whether the commits have already been merged because they ID each commit across the merging paths it takes.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With