特徵 |
CVS |
Git |
Mercurial |
Subversion |
是否原子提交 |
CVS: 沒有. CVS提交不是原子的 |
Git: 是的. 提交都是原子的 |
Mercurial: 是的 |
Subversion: 提交都是原子的 |
文件和目錄是否能夠移動或重命名 |
CVS: 不是. 重命名不支持. 若是手動進行, 可能會損壞歷史記錄 |
Git: 支持重命名, 這是很實用的目的. git甚至能檢測到重命名以後文件的改變. 儘管如此, 基於特殊的存儲結構, 重命名不會被顯示的記錄, git可以推導出來(在實際使用中很容易作到) |
Mercurial: 是的, 重命名是支持的 |
Subversion: 是的. 支持重命名 |
在移動或重命名以後智能合併 |
CVS: 不能. 重命名都不支持, 就沒必要說智能了 |
Git: 不支持. 細節在Git FAQ裏: 「Git有一個重命名的命令git mv, 可是這僅僅是爲了便利. 效果和移掉某個文件, 增長另一個文件沒有任何區別」 |
Mercurial: 是的. 重命名以後智能合併是支持的. Mercurtial文檔說:「若是我修改一個文件,而你從新命名了這個文件, 而後咱們合併咱們的變動, 那麼我所作的修改就會被更新到根據舊文件名字而產生的新文件裏(這可能就是你所指望的‘最簡單的動做’, 可是不是全部版本控制系統都支持) |
Subversion: 不支持. 「svn help me「中提到「注意: 這個子命令至關於拷貝和刪除.「而且可能有個bug |
文件和目錄拷貝 |
CVS: 不能. 拷貝不支持 |
Git: 不能. 拷貝不支持 |
Mercurtial: 是的. 支持拷貝 |
Subversion: 是的. 而且拷貝很是容易(O(1)). 包括產生分支 |
遠程存儲倉庫的備份 |
CVS: 間接的. 可使用John Polstra寫的CVSup |
Git: 是的. 是git的內部特徵 |
Mercurial: 是的 |
Subversion: 間接的. 可使用Chia-liang Kao的SVN::Mirror插件(好像是臺灣人)或Shlomi Fish的SVN-Pusher工具 |
是否傳遞變動到父倉庫 |
CVS: 不會 |
Git: 是的(Linux內核開發過程常用這個特徵) |
Mercurtial: 是的 |
Subversion: 是的, 使用要麼是Chia-Ling Kao的SVN::Mirror腳本或者Shlomi Fish的svn-push工具 |
倉庫權限 |
CVS: 頗有限. 「pre-commit hook scripts「可以被用來實現各類權限控制系統 |
Git: 請看和Git一塊兒附帶的contrib/hooks/update-paranoid. 看和svnperms相似的path_rules的代碼 |
Mercutial: 是的. 它可以鎖住倉庫, 子目錄或者使用hooks後的文件 |
Subversion: 是的. 基於HTTP權限的WebDAV-based模塊可以支持基於目錄級的倉庫 |
變動集 |
CVS: 不是. 變動是基於文件的 |
Git: 是的. 是支持的, 建立他們很容易 |
Mercurial: 是的. 變動集是支持的 |
Subversion: 部分支持. 對於一次提交會隱式建立一個變動集 |
跟蹤線性的文件歷史 |
CVS: 是的. cvs annotate |
Git: 是的.(git blame) |
Mercurial: 是的(hg annotate) |
Subversion: 是的(svn blame) |
可以只在倉庫的單目錄下做用 |
CVS: 是的 |
Git: 不是. 儘管如此, 提交多少能被限制, 請看「Repository Permissions」 |
Mercurial: 可以基於某樹的某個子集進行提交. 也有局部檢出的能力 |
Subversion: 是的 |
跟蹤未提交的變化 |
CVS: 是的. 經過cvs diff |
Git: 是的. 另外, 分支在git裏很是智能, 在某些工做流裏可以被當成是另一個未提交代碼的存儲庫. 請看「git stash「命令 |
Mercurial: 是的. 使用hg diff |
Subversion: 是的. 使用svn diff |
基於單個文件的提交信息 |
CVS: 不是. 提交信息是基於單次變化的 |
Git: 是的. 提交信息基於變動集 |
Mercurial: 不是 |
Subversion: 不是. 沒有這個特徵 |
文檔 |
CVS: 很是棒. 有不少在線的tutorials和資源, 在線的書籍. 命令行客戶端也支持一個在線的幫助系統 |
Git: 良好. 短的幫助比較簡潔難懂. man頁頗有份量, 但容易誤解. 有不少tutorial |
Mercurial: 很好. 有基於公司的書籍和wiki. 每一個命令都集成了幫助 |
Subversion: 很好. 有一些在線的書籍和一些在線的tutorials和資源. 而且書籍是以docbook/xml寫的因此很容易變換成其餘格式. 命令行一樣提供了在線的幫助系統 |
配置是否輕鬆 |
CVS: 好. 是個事實上的標準. 基於每一個系統都有而且很容易配置 |
Git: 好. 在現有平臺上二進制可用. 須要C編譯器和Perl. 在windows上須要cygwin. 並有一些Unix特徵 |
Mercurial: 很是好. 幾乎全部平臺都有二進制包. 從源碼編譯須要python2.3以上, 而且須要C編譯器 |
Subversion: Subversion服務器須要安裝在apache2模塊裏(若是有人但願HTTP做爲底層協議的話)或使用它自身的服務器. 客戶端須要Subversion特徵的邏輯還有WebDAV庫(針對HTTP). 安裝組件很直接, 可是須要一些額外的工做(假定subversion在某些平臺沒有二進制包可用) |
命令集 |
CVS: 包含了3個常常用到的命令的簡單的命令集(cvs commit, cvs update和cvs checkout)和其它一些 |
Git: 命令集很豐富, 而且和CVS不兼容 |
Mercurial: 嘗試模仿CVS交互方式, 可是偏離了基於不一樣的設計的意圖 |
Subversion: 類CVS的命令集, 可以很容易被CVS用戶使用 |
網絡支持 |
CVS: 好. cvs在不一樣的場合使用不一樣的協議. 協議可以經過ssh連接的加密隧道進行 |
Git: 很是棒. 可以使用本地的git協議, 但也能在rsync, ssh, HTTP和HTTPS上使用 |
Mercurial: 很是棒. 使用HTTP或ssh. 遠程訪問會很是安全, 在只讀網絡裏不須要上鎖 |
Subversion: 很是好. Subversion服務器支持WebDAV+DeltaV(基於HTTP或HTTPS)做爲底層協議, 或者它自身的協議一樣能在ssh連接通道里使用. |
可移植性 |
CVS: 好. 客戶端能在UNIX, Windows和Mac OS上使用. 服務器端能在UNIX, 附有UNIX模擬層的Windows上使用 |
Git: 客戶端運行在大多數的UNIX系統上, 但沒有MS-Windows本地程序. 基於cygwin的系統看起來也能使用 |
Mercurial: 很是棒. 運行在基於全部能運行python的平臺.倉庫是兼容性的基於CPU結構和字節序的 |
Subversion: 很是好. 客戶端和服務器端都能在UNIX, Windows和Mac OS X上運行 |
web接口 |
CVS: 是的. CVSweb, ViewVC, Chora和wwCVS |
Git: 是的. Gitweb包含在發佈包中 |
Mercurial: 是的. Web接口是內置組件 |
Subversion: 是的. ViewVC, SVN::Web, WebSVN, ViewSVN, mod_svn_view, Chora, Trac, SVN::RaWeb::Light, SVN Browser, Insurrection和perl_svn.另外, Subversion的apache服務也提供了一個基礎的web接口 |
圖形用戶界面 |
CVS: 很是好. 有不少圖形界面能夠用: WinCVS, Cervisia(對於KDE), TortoiseCVS(Windows瀏覽器插件) |
Git: Gitk包含在發行版中. Qqit和Git-gui工具也可以使用 |
Mercurial: 經過hgit擴展查看歷史; 檢入擴展(hgct)使得提交很容易. 一些第三方的IDEs和GUI工具(如eric3, meld)有一些集成的Mercurial支持 |
Subversion: 很是好. 有不少GUIs可用: RapidSVN(跨平臺), TortoiseSVN(Windows瀏覽器插件), Jsvn(java), 等. 大多數都還在開發中 |