Comparison between Bazaar, CVS, Git, Mercurial, Subversion

Back to main page

   
SCM feature: Bazaar [-] CVS [-] Git [-] Mercurial [-] Subversion [-] Add to comparison: +AccuRev
+Aegis
+AllChange
+Arch
+BitKeeper
+ClearCase
+CM+
+CMSynergy
+Co-Op
+Darcs
+Fortress
+LibreSource Synchronizer
+Monotone
+OpenCM
+Perforce
+PureCM
+SourceAnywhere
+Superversion
+Surround SCM
+svk
+Team Foundation Server
+Vault
+Vesta
+Visual SourceSafe
Atomic Commits
Bazaar: Yes. Commits are atomic. CVS: No. CVS commits are not atomic. Git: Yes. Commits are atomic. Mercurial: Yes. Subversion: Commits are atomic.
Files and Directories Moves or Renames
Bazaar: Yes. Renames are supported for files and directories. CVS: No. Renames are not supported and a manual one may break history in two. Git: Renames are supported for most practical purposes. Git even detects renames when a file has been changed afterward the rename. However, due to a peculiar repository structure, renames are not recorded explicitly, and Git has to deduce them (which works well in practice). Mercurial: Yes. Renames are supported. Subversion: Yes. Renames are supported.
Intelligent Merging after Moves or Renames
Bazaar: Yes. Renames are intelligent. CVS: No. Renames are not supported at all, much less intelligent ones. Git: No. As detailed in the Git FAQ: "Git has a rename command git mv, but that is just a convenience. The effect is indistinguishable from removing the file and adding another with different name and the same content." Mercurial: Yes, intelligent merging after renames is supported. the Mercurial book says: "If I modify a file, and you rename it to a new name, and then we merge our respective changes, my modifications to the file under its original name will be propagated into the file under its new name. (This is something you might expect to 'simply work,' but not all revision control systems actually do this.)" Subversion: No. "svn help me" says "Note: this subcommand is equivalent to a 'copy' and 'delete'." There's a bug report about it.
File and Directory Copies
Bazaar: No. Copies are not supported. CVS: No. Copies are not supported. Git: No. Copies are not supported. Mercurial: Yes. Copies are supported Subversion: Yes. And it's a very cheap operation (O(1)) that is also utilized for branching.
Remote Repository Replication
Bazaar: Yes. CVS: Indirectly, by using CVSup by John Polstra (which requires running the cvsupd daemon on the server) Git: Yes. This is very intrinsic feature of Git. Mercurial: Yes. Subversion: Indirectly, by using Chia-liang Kao's SVN::Mirror add-on or Shlomi Fish' SVN-Pusher utility.
Propagating Changes to Parent Repositories
Bazaar: Yes. CVS: No. Git: Yes. (The Linux kernel development process uses this extremely often). Mercurial: Yes. Subversion: Yes, using either Chia-Ling Kao's SVN::Mirror script or the svn-push utility by Shlomi Fish.
Repository Permissions
Bazaar: Basic access control can be implemented through a contributed hook script. ACL support for the Bazaar server is planned. CVS: Limited. "pre-commit hook scripts" can be used to implement various permissions systems. Git: See contrib/hooks/update-paranoid that ships with Git. See the path_rules code for the closest equivalent to svnperms. Mercurial: Yes. It is possible to lock down repositories, subdirectories, or files using hooks. Subversion: Yes. The WebDAV-based service supports defining HTTP permissions for various directories of the repository.
Changesets' Support
Bazaar: Yes. Changesets are supported. CVS: No. Changes are file-specific. Git: Yes, Changesets are supported, and there's some flexibility in creating them. Mercurial: Yes. Changesets are supported. Subversion: Partial support. There are implicit changeset that are generated on each commit.
Tracking Line-wise File History
Bazaar: Yes. (bzr annotate). CVS: Yes. cvs annotate Git: Yes. (git blame). Mercurial: Yes. (hg annotate) Subversion: Yes. (svn blame)
Ability to Work only on One Directory of the Repository
Bazaar: For checkouts: No. For checkins: Yes. CVS: Yes. Git: No. However, commits could be restricted somewhat, see the "Repository Permissions". Mercurial: It is possible to commit changes only in a subset of the tree. There are plans for partial checkouts. Subversion: Yes.
Tracking Uncommited Changes
Bazaar: Yes, using "bzr diff". CVS: Yes. Using cvs diff Git: Yes. Also, branches are very lightweight in Git, and could be considered a kind of storage for "uncommitted" code in some workflows. Also see the "git stash" command. Mercurial: Yes. Using hg diff. Subversion: Yes. Using svn diff
Per-File Commit Messages
Bazaar: With respect to pure Bazaar: No. At least one plugin (bzr-gtk) supports it though. CVS: No. Commit messages are per change. Git: No. Commit messages are per changeset. Mercurial: No. Subversion: No. There is no such feature.
Documentation
Bazaar: Excellent. Apart from online help in the command line client there exist tutorials, a reference card ("Quick Start Guide"), several full fledged guides and references, and documents on specialized topics, such as migration from other VCS systems and different workflows. The documentation comes in html and plain-text formats. The API of the underlying library is fully documented. In the UI design of the command line client special attention was paid to make it easy to get started with Bazaar. CVS: Excellent. There are many online tutorials and resources and an online book. The command line client also provides an online comprehensive help system. Git: Medium. The short help is too terse and obscure. The man pages are extensive, but tend to be confusing. The are many tutorials. Mercurial: Very good. There is a companion book and a wiki. Every command has integrated help. Subversion: Very good. There is a free online book and some online tutorials and resources. The book is written in DocBook/XML and so is convertible to many different formats. The command-line client also provides a good online help system that can be used as a reference.
Ease of Deployment
Bazaar: Very easy. Bazaar has an installer for MS Windows and packages for some major Linux distributions, FreeBSD, and Mac OS X. The dependencies for manual installation are listed on the Bazaar website. CVS: Good. Out of being the de-facto standard, CVS is available on most systems and is easy to deploy. Git: Good. Binary packages are available for modern platforms. C compiler and Perl are required. Requires cygwin on Windows, and has some UNIXisms. Mercurial: Excellent. Binary packages are available for all popular platforms. Building from source requires only Python 2.3 (or later) and a C compiler. Subversion: A Subversion service requires installing an Apache 2 module (if one wishes to use HTTP as the underlying protocol) or its own proprietary server. The client requires only the Subversion-specific logic and the Neon WebDAV library (for HTTP). Installation of the components is quite straightforward, but will require some work, assuming Subversion does not come prepackaged for one's system.
Command Set
Bazaar: Tries to follow CVS conventions, but deviates where there is a different design. CVS: A simple command set that includes three most commonly used commands (cvs commit, cvs update and cvs checkout) and several others. Git: Command set is very feature-rich, and not compatible with CVS. Mercurial: Tries to follow CVS conventions, but deviates where there is a different design. Subversion: A CVS-like command set which is easy to get used to for CVS-users.
Networking Support
Bazaar: Excellent. Works natively over HTTP (read-only), FTP and SFTP without having Bazaar installed at the remote end. Works over HTTP, SSH and a custom protocol when talking to a remote Bazaar server. Supports RSYNC and WebDAV (experimental) through plugins. CVS: Good. CVS uses a proprietary protocol with various variations for its client/server protocol. This protocol can be tunneled over an SSH-connection to support encryption. Git: Excellent. Can use native Git protocol, but works over rsync, ssh, HTTP and HTTPS also. Mercurial: Excellent. Uses HTTP or ssh. Remote access also works safely without locks over read-only network filesystems. Subversion: Very good. The Subversion service can use either WebDAV+DeltaV (which is HTTP or HTTPS based) as its underylying protocol, or its own proprietary protocol that can be channeled over an SSH connection.
Portability
Bazaar: Works on MS Windows, Linux, Mac OS X, FreeBSD, UNIX, and basically on any system that has a recent Python port. With case-insensitive file systems there are some issues that can be avoided by using a graphical frontend. On MS Windows there is a plugin to support tracking of symlinks even if they are not supported natively by the file system. CVS: Good. Client works on UNIX, Windows and Mac OS. Server works on UNIXes and on Windows with a UNIX emulation layer. Git: The client works on most UNIXes, but not on native MS-Windows. The cygwin build seems to be workable, though. Mercurial: Excellent. Runs on all platforms supported by Python. Repositories are portable across CPU architectures and endian conventions. Subversion: Excellent. Clients and Servers work on UNIX, Windows and Mac OS X.
Web Interface
Bazaar: Yes, several: Loggerhead, Webserve, Bzrweb, and Trac. CVS: Yes. CVSweb, ViewVC, Chora, and wwCVS. Git: Yes. Gitweb is included in distribution. Mercurial: Yes. The web interface is a bundled component. Subversion: Yes. ViewVC, SVN::Web, WebSVN, ViewSVN, mod_svn_view, Chora, Trac, SVN::RaWeb::Light, SVN Browser, Insurrection and perl_svn. Aside from that, the Subversion Apache service provides a rudimentary web-interface.
Availability of Graphical User-Interfaces.
Bazaar: There are several graphical frontends in development, see the Bazaar Plugins page and the Third-party Tools page. Notable are QBzr (Qt) and bzr-gtk (GTK+), which can be considered beta quality. Work is also being done on integrating Bazaar with Windows Explorer, Eclipse, Nautilus, and Meld. CVS: Very good. There are many available GUIs: WinCVS, Cervisia (for KDE), TortoiseCVS (Windows Explorer plug-in). Git: Gitk is included in distribution. Qgit and Git-gui tools are also available. Mercurial: History viewing available with hgit extension; check-in extension (hgct) makes committing easier. Some third-party IDEs and GUI tools (e.g. eric3, meld) have integrated Mercurial support. Subversion: Very good. There are many available GUIs: RapidSVN (cross-platform), TortoiseSVN (Windows Explorer plug-in), Jsvn (Java), etc. Most of them are still under development.
 


Information taken from Better SCM Initiative website by Shlomi Fish (shlomif@iglu.org.il).

Reorganized for usability by Alexey Mahotkin (Version Control Blog) in 2008.

 

Creative Commons License
This work is licensed under a Creative Commons License.