版本控制软件比较

以下是**版本控制軟體比較**。下表包括知名的版本控制和軟體組態管理（SCM）軟體的一般資訊和技術資訊。對不適用原始碼的 SCM 軟體，見開源組態管理軟體比較。

## 一般資訊

**表格說明**

* _庫模式_表示原始碼庫各個副本之間的關係。在一個主從式架構中，使用者通過客戶端存取總庫；一般而言，他們本地機器只儲存專案樹的一個工作副本。工作副本的變化必須提交到總庫之後才能反映給其他使用者。而在分散式架構中，庫之間是平等的，使用者一般除了他們的工作副本之外，還有本地庫來存放版本歷史。
* _併發模式_表示如何管理工作副本的變化，以防止同時編輯造成庫中的資料混亂。在_鎖定_模式下，只有使用者從總庫請求並得到了一個檔案的排他鎖，才允許改變檔案。在_合併_模式下，使用者可以自由編輯檔案，但當他們提交變化到總庫時會被告知可能存在衝突，隨後版本控制系統可能會對雙方合併這些變化，或者當發生衝突時讓使用者來決定。注意，分散式版本控制幾乎都是合併的併發模式。

## 技術資訊

**表格說明**

* _軟體_：應用的名稱。
* _程式語言_：程式語言中的應用正在發展
* _儲存方法_：表示檔案在庫中儲存的形式。_快照_表示提交的檔案被整個儲存 —— 通常是壓縮的。_變化集_表示提交的檔案只儲存它與前後版本的區別。
* _變化範圍_：表示記錄的變化是針對單獨的_檔案_，還是整個目錄_樹_。
* _版本 ID_：用來在庫中標識檔案的特定版本。系統可以使用_偽隨機_識別碼、版本的內容雜湊值或帶有版本序列號（命名空間）的檔名。而 Integrated Difference 的版本號則基於變化集自身，它可以表示多個檔案的變化。
* _網路協定_：同步變化時所使用的協定列表。
* _原始碼規模_：原始碼的大小以兆（megabyte）為單位。

## 功能

**表格說明**

* _軟體_：應用的名稱。
* _原子提交_：保證所有的改變都提交成功或者都不成功。
* _檔案重新命名_：表示系統是否允許檔案在改名後仍然保留他們的版本歷史。
* _合併檔案重新命名_：表示系統是否能夠將一個分支上的檔案變化合併到另一個分支上已重新命名的同一個檔案上（或者相反）。 如果同一個檔案在兩個分支上都已經重新命名，則產生重新命名衝突，必須由使用者來解決。
* _符號連結_：表示一個系統是否允許象普通檔案一樣對符號連結進行版本控制。 對符號連結的版本控制，某些人認為是一項功能，而另一些人則認為存在安全隱患（例如，一個到 /etc/passwd 的符號連結）。符號連結只支援特定的平台，這取決於軟體的實現。
* _前 / 後事件觸發_：表示有能力在一個動作之前或之後觸發命令，例如發生一個提交的動作。
* _簽章版本_：指整合了版本的數位簽章，例如以 OpenPGP 的格式。
* _合併跟蹤_：表示一個系統是否記得在哪些版本之間合併了哪些變化，並且只合併那些從一個分支合併到另一個分支時遺失的變化。
* _換行轉換_：表示一個系統是否能適配文字檔案的換行符，從而匹配當前使用的作業系統的換行方式。控制變化的粒度，例如 Subversion，可以進行組態，依據檔案類型來處理換行符的不同，而 Perforce 根據一個單一、每個客戶端的組態轉換所有的文字檔案。
* _標籤_：表示是否可以給一個特定版本賦予一個帶有含意的名字，無論這些名字被叫做標記還是標籤。
* _國際化支援_：表示該軟體是否支援多語言環境和多作業系統。
* _Unicode 檔名支援_：表示該軟體是否支援使用不同 [[字符编码]] 的檔案系統之間的互操作。
* _大庫支援_：系統能高效處理十億位元組左右或更大的庫嗎？

## 進階功能

**表格說明**

* _關鍵詞擴充_：支援關鍵詞自動擴充，例如檔案版本號。
* _互動式提交_：互動式提交允許使用者對變化精挑細選，並決定哪些變化可以提交（未被選擇的變化只被保留為工作副本的變化），而不是只到檔案級別的粒度。
* _外部參照_：在原始碼樹中嵌入外部庫。
* _部分檢出 / 複製_：從庫中只檢出或複製特定子目錄的能力。
* _權限位_：在版本歷史中跟蹤檔案權限位。
* _保留時間戳_：對於檔案系統屬性中的_最後修改時間_，以提交時間覆蓋檢出時間。
* _使用者自動合併工具_：自動合併可以嘗試通過使用者選擇的任何工具來進行（希望能以每個檔案為基礎來組態）。
* _支援的格式_：支援讀 / 寫，或者唯讀（轉換，有可能再重複）。
* _共享所得目標的構建快取_：通過這一能力，如果其他協同運作使用者恰好共享了同樣的依賴，可以引入其他使用者構建的所得目標，而無需在本地重建它們。

## 基本命令

**表格說明**

* 綠格中不在 [方括號] 里的命令使用了互動式的命令列提示符。[方括號] 中的文字用來解釋哪裡能找到等價功能。
* _庫初始化_：建立一個新的空庫（比如，版本控制資料庫）。
* _克隆_：建立一個完全相同的庫實例（在一個安全事務中）。
* _拉_：將版本從遠端庫下載到本地庫。
* _推_：將版本從本地庫上傳到遠端庫。
* _本地分支_：建立一個不存在於原始遠端庫中的本地分支。
* _檢出_：從（遠端）庫建立一個本地工作副本。
* _更新_：用庫中的最新版本更新工作副本中的檔案。
* _鎖定_：鎖定庫中的檔案，以免被其他使用者更改。
* _添加_：標記指定的檔案，以便在下一次提交時添加到庫中。
* _移除_：標記指定的檔案，以便在下一次提交時移除（註：儲存在移除時及之前的相關版本歷史）。
* _移動_：標記指定的檔案，以便在下一次提交時移動到新的位置。
* _拷貝_：標記指定的檔案，以便在下一次提交時拷貝。
* _合併_：融合同一個工作副本路徑的兩個來源之間的差別。
* _提交_：將變化記錄到庫中。
* _恢復_：從庫中恢復工作副本檔案。
* _生成打包檔案_：建立一個包含壓縮的對給定庫的變化集的檔案。
* _重定位_：將本地提交重定位到已更新的上游位址。

## 進階命令

**表格說明**

* 綠格中不在 [方括號] 里的命令使用了互動式的命令列提示符。[方括號] 中的文字用來解釋哪裡能找到等價功能。
* _命令別名_：為指定的命令或組合建立客製化的別名
* _鎖定 / 解鎖_：排他性地鎖定一個檔案，以防被其他人編輯。
* _擱置 / 取消擱置_：在工作目錄中暫時擱置部分或全部的變化。
* _回滾_：從歷史中移除一個版本。
* _挑選_：只把某些修訂從一個分支移動到另一個分支（而不是合併分支）。
* _二分檢索_：在原始碼歷史中，使用二分檢索來尋找一個變化的引入或修復。
* _出入_：查詢本地庫和遠端庫之間的差別（該差別可能會以推 / 拉的方式傳送 / 取回）。
* _過濾_：在庫中搜尋，以找到那些匹配一個模式的行。
* _記錄_：在一次提交中只包含一個檔案的某些變化，而不包含其它的變化。

## 使用者介面

**表格說明**

* _軟體_：應用的名稱。
* _網頁版介面_：表示應用軟體是否包含一個網頁版介面。網頁版介面可以允許軟體傳送診斷資料到一個網站，甚至能允許對應用軟體進行遠端控制。
* _圖形介面_：GUI，圖形化使用者介面。 如果一個軟體產品提供了 GUI，它的功能可以通過應用程式窗口來存取，而不是只能通過象 DOS 介面一樣在命令提示符後面敲入命令來存取。
* _外掛程式_：功能通過整合式開發環境來實現。 最低的功能應該是，列出檔案的版本狀態，及檢入 / 檢出檔案。

## 歷史及使用者

**表格說明**

* _軟體_：應用的名稱。
* _歷史_：簡短地講述軟體的起源好發展。
* _知名使用者_：使用該軟體作為_主要_版本控制系統的知名工程列表，不包括該軟體自己。如果它有一個完整的列表，後邊會列出該列表的連結。

## 參見

* 版本控制軟體列表
* 自由軟體代管服務比較

## 注釋

## 參考文獻