A Version Control System (VCS) or Source Control System is very vital and central to developing software and managing code+data (text, audio, video, images, etc). No matter if you are a single person or a small team or a large group, having your source in a Version Control System gives you a sound sleep at nights. It is a neat and quick way of walking through the history or revision of files. Not having a VCS, and trying to create process and protocols, schemas and rules to maintain a project becomes a tedious job and soon a nightmare.
Why use a VCS
A VCS gives its users the promise and peace of mind that they can easily “go-back-in-time” and look up, checkout an old revision of file.
A version control system is not only about maintaining different revisions or history of your source, but it also facilitates parallel lines of development via branching and merging. If you are doing a POC (Proof of concept) or working on a feasibility feature or an incremental change without interfering your working code, but still want to share with others, VCS is a great help.
When many people simultaneously make potentially incompatible changes, a VCS will help you to identify and resolve those conflicts. It helps team work independently, makes it easy to share, change or review it. It also helps in maintaining multiple versions of a product.
Top 7 Version Control Systems
There are a good lot of Version Control Systems available. Some Open-Source, some Proprietary. Almost all of them have the same set of features and offerings like repository, change, commit, branch, merge, tag (or label), resolve, update, changelist, checkout etc albeit may be with different terminology.
Traditional Source Control System uses a centralized model, where the master copy or true copy or golden copy is stored on a ‘master’ server, and everybody else is a client. Updating and committing changes to file results in file versions on the master server(s) visible to all. The problem with such a design was that it was difficult to work in an offline scenario. Meaning if the connection to the master VCS server is broken, it often becomes difficult to query the history of a repository. Though in the last few years we have seen a range of solutions which work on a distributed model, where every developer’s local repository serves as a complete copy of the master and thus they are not dependent on the master when working offline.
In this post we list some of the most popular and prevalent options available in the market today.
Git is unarguably the most hot and best version control system available. It is easy to learn with extensive documentation and community support forums. It is designed to handle from small to very large projects with speed and efficiency.
The branching and merging features present make it stand apart in its class. Switching, merging, pulling, tracking of branches is gentle and sleek. Because of Git’s distributed nature, nearly all operations are performed locally reducing communication overhead, giving it massive speed. No special guides and extensive tutorials needed to set it up.
GitHub and BitBucket are the most noted and adored web-based Git hosting service providers. They also offer several collaboration features like wiki, bug tracking, task management and rich API support for building third party applications or flows.
The Microsoft Team Foundation server is complete suite of version control system, bug reporting, testing, project management, release management, lab management, backlog management, cloud based load testing.
The thing that I like most about TFS is reporting and collaborating via the team rooms for discussing progress, sharing status and clarifying issues. No going back and forth in mail for checking communication history and status updates.
Mercurial has a lightweight, easy to customise, decentralized distributed source control management system where every working directory is teemed with a private copy of the history. It has a distinct way of sharing and communicating changes. Mercurial is well suited for scripting tasks, and its clean internals and implementation in Python make it easy to add features in the form of extensions.
Subversion was originally designed to better CVS. It has a simple basic design model and interface making it incredibly easy to use. It has a great support for displaying translated messages in locale settings. It even has a standalone server option where you can run it over a custom protocol and not over HTTPD server. The standalone server can also be tunneled over SSH.
The one feature I like the most in Subversion is file-locking, where the file will be present in ‘read-only’ mode to others until the lock is acquired.
Perforce is a commercial CVS from Perforce Software. It has a centralized model but can be configured to distribute workload across nodes in a clustered configuration, making it scalable and fast, thus guaranteeing automated failovers. The P4V client (Perforce visual client) is one of the richest GUI which provides a rich visual presentation of what’s happening in there.
ClearCase (Or IBM Rational ClearCase) is a Proprietary Software from the IBM stable , which makes it easy to integrate with other IBM solutions like IBM Rational Team Concert (Agile application lifecycle management), IBM Rational ClearQuest (change and defect tracking solution), IBM Rational Asset Manager, and IBM Rational Application Developer. It meets all compliance requirements with its secure and controlled access mechanisms and protocols.
I have first hand experience working with TFS, Git, Subversion and Perforce :). It’s hard and unfair to rate one over the other. I have enjoyed working on (in?) them. But I would like to say that working on Git based version control systems has its advantages. First the whole ‘I-have-the-complete-history-on-my-box’ makes things easier, no slow lookups and connections to the central server. And second the choice of client GUIs to work with makes it more appealing.
What do you guys think? Let us know your favourite version control system and any special feature it offers for your development needs.