If you're new here, you may want to subscribe to my free RSS feed. Thanks for visiting!

There are two trends that have emerged over the last few years that have had a significant impact on the version control tool space. In the past we’ve seen major shifts as version control tools went from small file oriented versioning systems like SCCS and RCS to tools that more easily managed a complete source tree like CVS. The move to handling complete source trees had with it a move to handle networks better and so was born things like the capabilities to use CVS over a network and its offspring subversion. This pretty much was the state of the revision control space for some time.

Direction #1 - Distributed Revision Control

Bitkeeper introduced a major innovation whose impact is still playing out, namely a highly distributed repository with local commit capability. This innovation got major street cred since bitkeeper was used to manage the linux kernel source for some time. When that relationship ended, a whole set of new tools were developed to fill the void including tools such as monotone, mercurial, bazaar and others (darcs ??). The primary feature of all these tools is their use of a local repositories allowing developers to commit locally while also providing for a means to share changes between repositories. Of course the distributed side of these tools is optional allowing a project to centralized if they choose.

This architectural direction is likely here to stay. Software organizations are becoming more distributed not less so. Additionally hosts of young software engineers brought up participating in open source projects that use these tools chafe at the restrictions imposed by centralized version control tools.

Direction #2 - Whole Tree Version Control

This is likely more controversial. The summary of distributed revision control systems above purposely ignored one of the largest such tools, namely GIT, the revision control system written by Linus Torvalds. GIT is the tool of choice for managing the linux Kernel and serves as the replacement for Bitkeeper. GIT is a distributed revision control system at its heart and so it could easily be placed in the distributed category.

What distinguishes GIT from the other distributed revision control systems is its unique repository structure and consequently, how it records changes. All of the above tools, including their predecessors like CVS, Subversion, RCS, SCCS, etc all think about a software tree as a set of versioned files and their repositories reflect this. Versioning is conducted at the file level. Thus, if you interrogate the system for the history of changes to the whole tree, it derives that from the set of changes recorded in each file archive. If you need to extract a “snapshot” or label of the software, the versioning tools need to traverse each file archive and extract the correct version. In this sense, the traditional repository structure stores what is necessary to derive the contents of the whole tree.

GIT completely abandons this model to its great profit. A change set for git is not a collection of revisions to files, but rather a snapshot of the whole software tree with some new objects created inside the snapshot to represent changed files. This makes whole tree operations much much faster and safer. It also makes advanced merge capabilities much easier to deal with because the context for the change (the whole tree) is always in view. Most importantly though, this is a much safer repository structure since the actual contents of a tree at a point in time are not derived from the revisions of individual files which can be corrupt. The repository simply stores this what the tree looks like. This is an extremely innovative departure from how version control has been performed.

My bet is that these two trends will continue to impact how version control systems are architected for some time to come.

Relevant Links:

Linus Torvalds on GIT at the Googleplex

Repository Formats Matter

A look back: Brahm Cohen vs. Linus Torvalds

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • Google
  • Reddit
  • Spurl
  • StumbleUpon

If you enjoyed this post, make sure you subscribe to my RSS feed!