版本控制系统 之一 概念、分类、常见版本控制系统(CVS、SVN、BitKeeper、Git 等)
是什么
??版本控制系統(Version Control System,VCS)是一種軟件,可以幫助軟件團隊的開發人員協同工作,并存檔他們工作的完整歷史記錄。
為什么
在我們的實際開發過程中,經常會有這種需求或問題
歷史分類
??縱觀版本控制系統的發展歷史,《Version Control By Example》一書的作者 Eric Sink 在他的書中對版本控制進行了分類,廣義上講,版本控制工具的歷史可以分為三代:
| 第一代 | 無 | 僅一個文件 | 鎖定的 | RCS, SCCS |
| 第二代 | 集中式 | 多文件 | 提交之前合并 | CVS, SourceSafe, Subversion, Team Foundation Server |
| 第三代 | 分布式 | 變更的集合 | 合并之前提交 | Bazaar, Git, Mercurial |
《Version Control By Example》可以直接在作者的網站下載電子版(PDF 或 EPUB)
第一代
??第一代版本控制系統被稱為本地版本控制系統。通過加鎖將并發執行轉換成順序執行。 一次只能有一個人處理文件。具體流程如下:首先,應該把文件放在一個服務器上,方便使用者上傳或下載文件;其次,任何人想對文件修改時,需要先把這個文件加鎖,通過checkout指令,使得其他人無法修改;最后,當修改完成之后,需要釋放鎖,通過checkin指令,形成一個新的版本,存放到服務器端。
??第一代版本控制系統主要有 RCS、SCCS(1972年發布)和 DSEE(被認為是 Atria ClearCase 的前身)。目前,有些項目還在使用!
悲觀鎖
??每次獲取數據的時候,都會擔心數據被修改,所以每次獲取數據的時候都會進行加鎖,確保在自己使用的過程中數據不會被別人修改,使用完成后進行數據解鎖。由于數據進行加鎖,期間對該數據進行讀寫的其他線程都會進行等待。
第二代
??第二代版本控制系統被稱為集中式版本控制系統(Centralized Version Control Systems,CVCS),其對同步修改更加寬容,但有一個明顯的限制,用戶必須在允許提交之前將當前修訂合并到他們的工作中。
由上圖可看到,在集中式版本控制系統中,如果服務器嗝屁了,那么所有的開發者就只能干瞪眼了!因為,SVN 對于項目的管理是依賴于服務器中的中心倉庫的!我們的更改必須要提交到服務器中的中心倉庫。
??第二代版本控制系統主要有 CVS、SourceSafe、Subversion、Team Foundation Server、SVK。
樂觀鎖
??每次獲取數據的時候,都不會擔心數據被修改,所以每次獲取數據的時候都不會進行加鎖,但是在更新數據的時候需要判斷該數據是否被別人修改過。如果數據被其他線程修改,則不進行數據更新,如果數據沒有被其他線程修改,則進行數據更新。由于數據沒有進行加鎖,期間該數據可以被其他線程進行讀寫操作。
??樂觀鎖一般會使用版本號機制或 CAS 算法實現。
第三代
??第三代版本控制系統被稱為分布式式版本控制系統(Distributed Version Control Systems,DVCS),其允許合并和提交分開。在每個使用者電腦上就有一個完整的數據倉庫,沒有網絡依然可以使用。
由上圖可看到,分布式式版本控制系統也可以有個服務器端的倉庫,用來同步各開發者的私有倉庫!在分布式版本控制系統中,每個參與者的本地也會有一個完整的倉庫。及時服務器端崩潰,我們仍然可以使用 Git(僅在本地倉庫管理我們的代碼),在網絡具備時,再和服務器進行同步即可!
??第三代版本控制系統主要有 Bazaar、Git、Mercurial、BitKeeper,、Monotone。目前,第三代版本控制系統已經大有一同江湖的趨勢(具體見 RhodeCode 在 2016 年做過的一項分析報告 Version Control Systems Popularity in 2016)!
RCS
??修訂控制系統(Revision Control System,RCS) 是第一代的版本控制系統。它是一組 UNIX 命令(暫時沒有找到有 UI 界面的軟件),允許多個用戶開發和維護程序代碼或文檔。
??RCS 于 1982 年由 Purdue University 的 Walter F. Tichy 首次發布。 它是當時流行的源代碼控制系統(SCCS,它幾乎是第一個版本控制軟件工具,早期 Unix 開發人員于1972年開發)的替代工具。 RCS 目前由 GNU 項目維護。GNU 官網介紹:https://www.gnu.org/software/rcs/;項目維護地址:http://savannah.gnu.org/projects/rcs/
??目前,我們可以從GNU RCS 的項目地址: http://savannah.gnu.org/projects/rcs/ 或者 Purdue University 的 RCS 官網 https://www.cs.purdue.edu/homes/trinkle/RCShome/ 下載最新版本的可執行程序、源碼、文檔。其中,GNU 官網只有源代碼,沒有預編譯的可執行程序。Purdue University 的 RCS 官網倒是有一個舊版本的 Windows 平臺的可執行程序。
CVS
??并發版本系統(Concurrent Versions System,CVS)是最初的第二代版本控制系統。大約十年間,它是最為流行的版本控制系統,直到 2000 年被 Subversion 所取代。CVS 的安裝教程可以在其項目主頁 上找到。由于 CVS 是集中式版本控制系統,所以它有客戶端和服務端之區分。但要開始使用 CVS 的話,即使只在你的本地機器上使用,也必須設置 CVS 的服務端。
??CVS 最早是由一位名叫 Dick Grune 的荷蘭科學家在 1986 年開發的,當時有一個編譯器項目,他正在尋找一種能與其學生合作的方法。我在英文網站 http://dickgrune.com/Programs/CVS.orig/#History 中找到如下一段話:
I created CVS to be able to cooperate with my students, Erik Baalbergen and Maarten Waage, on the ACK (Amsterdam Compiler Kit) C compiler. The three of us had vastly different schedules (one student was a steady 9-5 worker, the other was irregular, and I could work on the project only in the evenings). Their project ran from July 1984 to August 1985. CVS was initially called cmt, for the obvious reason that it allowed us to commit versions independently.
??Grune 于 1986 年 6 月 23 日公開發布了該代碼。CVS 最初僅僅只是一個包裝了 RCS( 修訂控制系統(Revision Control System)) 的 Shell 腳本集合。最終演變成當前版本的 CVS 的代碼始于 1989 年 4 月的 Brian Berliner 的貢獻,后來由 Jeff Polk 和許多其他貢獻者提供幫助。 Brian Berliner 撰寫了一篇論文,介紹了他對 CVS 程序的改進 - 該程序描述了該工具是如何在 Prysma 內部擴展和使用的。 1990 年 11 月 19 日,CVS 1.0 版被提交給自由軟件基金會進行開發和分發。
關于 CVS 的使用可以參考這篇文章:https://zhuanlan.zhihu.com/p/51792519
VSS
??VSS 的全稱為 Visual Source Safe,是美國微軟公司出品的版本控制系統。兼容 Check out-Modify-Check in(獨占工作模式)與 Copy-Modify-Merge(并行工作模式)。它也屬于集中式版本控制系統。
??VSS 通常與微軟公司的 Visual Studio 產品同時發布,并且高度集成。VSS 使用文件系統作為存儲方式,每次版本變更時就需要大量地讀寫硬盤。這也是 VSS 最廣受垢弊的缺點。VSS2005 擁有Web 訪問功能,不再與 Visual Studio 同時發布。
??2008 年,微軟發布了 Team Foundation Server 的項目生命期管理工具,以替代 VSS。其不僅僅包含版本控制系統,還包括一系列的項目生命期管理工具。此中使用的還是集中式版本控制系統。
- Team Foundation Server:本地版本,用戶安裝使用!
- Team Foundation Service:云端版本,使用微軟賬戶登錄!
??2019 年,微軟發布了全新的 Azure DevOps Server。這不僅僅是個改名,整個軟件的架構都進行了重新的調整!有了它,我們就可以使用一系列的項目生命期管理工具。版本控制系統僅僅是其中的一小部分。注意其中的版本控制系統是基于 Git 的分布式版本控制系統。
- Azure DevOps Server:本地版本,用戶安裝使用!是 Team Foundation Server 的升級版本。
- Azure DevOps Service:云端版本,使用微軟賬戶登錄!是 Team Foundation Service 的升級版本。
SVN
??SVN(Subversion 的縮寫)是一個開放源代碼的版本控制系統,相較于 RCS、CVS,它采用了分支管理系統。SVN 由 CollabNet 公司于 2000 年資助并發起開發,目的是創建一個更好用的版本控制系統以取代 CVS。
??2000 年 2 月,CollabNet 聯系了 Open Source Development with CVS(Coriolis, 1999)的作者 Karl Fogel,問他是否愿意為這個新項目工作。這時 Karl 已經在和他的朋友 Jim Blandy 討論一個新的版本控制系統的設計。他不僅已經起好了名字 “Subversion”,而且有了 Subvesion 資料庫的基本設計。
??經過 14 個月的編碼,在 2001 年 8 月 31 號,Subversion 可以“自我寄生”了。就是說,Subversion 開發人員停止使用 CVS 管理 Subversion 的源代碼,開始使用 Subversion 代替。
??2009 年 11 月,Subversion 被 Apache Incubator 項目所接收。2010 年 1 月,正式成為 Apache 軟件基金會的一個頂級項目。項目地址:https://subversion.apache.org/,我們可以從中下載源代碼、文檔,沒有預編譯的可執行程序。
以下是幾款常用的 SVN 客戶端圖形化軟件:
- TortoiseSVN:開源軟件,在 Windows 上非常受到歡迎的一套客戶端軟件,它與資源管理器集成得相當不錯,可以透過資源管理器在文件或目錄上用鼠標右鍵的菜單完成 SVN 的操作。官方網站:http://tortoisesvn.net/
- SnailSVN:Mac OS X 平臺下類似 TortoiseSVN 的圖形化 SVN 客戶端,可自動標記文件狀態,并通過右鍵菜單提供各種常用 SVN 功能。 網站:https://langui.net/snailsvn/
- Ankhsvn:將 subversion 的操作集成進 Visual Studio 的 SVN 客戶端軟件。官方網站:http://ankhsvn.open.collab.net/
- Subclipse:將 Subversion 的操作集成進 Eclipse 的 SVN 客戶端軟件。官方網站:http://subclipse.tigris.org/
- SmartSVN:同時支持 Mac、Linux、Windows。是一款收費軟件。
BitKeeper
??BitKeeper 是一套 BitMover 公司開發的分布式版本控制軟件,它曾是一款專有軟件。BitKeeper 是最初的分布式源代碼控制系統。BitKeeper 的許多概念取自 TeamWare(Larry McVoy 在 Sun 公司時開發的產品)。
??BitMover 公司 CEO Larry McVoy 與 Linus 曾是好友, Larry 說服 Linus 在內核開發中使用 BitKeeper。而 BitKeeper 在免費使用的許可證中加入很多限制條件,惹惱了內核開發者,最終促使 Linus 開發出了毀滅 BitMove r的 Git。
2016 年 5 月 11 日,BitKeeper 宣布以 Apache 2.0 許可證開源。
Mercurial
??Mercurial 是跨平臺的分布式版本控制軟件,主要由 Python 語言實現。Mercurial一開始的主要運行平臺是 Linux,現在 Mercurial 已經移植到 Windows、Mac OS X 和大多數的類 Unix 系統中。Mercurial 主要由命令行程序組成,現在也有了圖形用戶界面。
??Mercurial 的創建者和主要開發人員是 Matt Mackal。其源代碼采用GNU通用公共許可證第二版為授權,確保了Mercurial是一個自由軟件。
Git
??在 Linux 開源的初期,Linux 開源項目的代碼是 linus 本人通過 linux 命令 diff 和 patch 兩條命令手動完成。隨著 Linux 代碼越來越壯大,靠 Linus 一個人來手動合并已經不現實。2002 年,Linus 選擇了一個商業版本控制系統 BitKeeper 作為 Linux 內核的代碼管理工具(BitKeeper 的開發商 BitMover 授權 linux 社區免費使用)。但是,免費使用是有很多的限制的,因此 linux 社區的大佬開始破解 BitKeeper。其中,samba 的作者 andrew 破解成功了。但是被 BitMover 公司發現,收回免費使用權。
??迫不得已,Linus 選擇了自己開發一個分布式版本控制工具以替代 BitKeeper。linus 閉關一個月,寫出了 Git。在一個月后,Git 成功接管了 Linux 社區的版本控制工作,并且開始開源。維基百科中,有如下歷史記錄:
- 2005 年 4 月 3 日,開始開發 Git。
- 2005 年 4 月 6 日,項目發布。
- 2005 年 4 月 7 日,Git 就可以作為自身的版本控制工具了。
- 2005 年 4 月 18 日,發生第一個多分支合并。
- 2005 年 4 月 29 日,Git 的性能就已經達到了 Linus 的預期。
- 2005 年 6 月 16 日,Linux 核心 2.6.12 發布,那時 Git 已經在維護 Linux 核心的源代碼了。
??在 2005 年 7 月 26 日,Linus 功成身退,將 Git 的維護交給另外一個 Git 的主要貢獻者 Junio C Hamano。
在 Linus Torvalds 開發出 Git 分布式版本控制系統 11 年后的 2016 年,BitKeeper 宣布在 Apache 2.0 許可證下開源。
參考
總結
以上是生活随笔為你收集整理的版本控制系统 之一 概念、分类、常见版本控制系统(CVS、SVN、BitKeeper、Git 等)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ARM 之十 ARMCC(Keil) m
- 下一篇: Git 之一 起源、安装、配置