[華為云在線課程][Git基礎與實操][第1章][Git基礎理論篇][版本控制工具簡介]
版本控制是一種記錄一個或若干文件內容變化,以便將來查閱特定版本修訂情況的系統,方便查看更改歷史,備份以及恢復以前的版本,保證多人協作不出問題。
1,原始的版本控制
版本控制工具的黑暗時代:
最原始的版本控制是純手工的版本控制:修改文件,保存文件副本;
保存副本命名隨意,版本難辨新舊,不能辨別每一版的修改內容。
2,版本控制起源:diff & patch
在最初的版本控制軟件出現之前,其實已經有了比較好用的源碼比較與打補丁的工具:diff和patch。
Linus Torvalds(Linux之父)也對這兩個工具偏愛有加。
在1991-2002年之間,即使CVS出現之后,Linus一直使用diff和patch管理著Linux的代碼。
diff與patch是用于源碼版本控制中的兩個最基本的概念。
CVS(Concurrent Versions System):協作版本系統。
2.1,Diff簡介
diff用來比較兩個文件或者目錄之間的差異。
2.2,Patch簡介
patch是diff的反向操作
我們把上述差異結果保存到文件中,例如:diff.txt中,那么這個diff.txt就可以用來從left.c推算出right.c的內容,反之亦可。
通過diff.txt,把left.c變成right.c的內容:
$ patch left.c diff.txt
上面執行的命令的意思是,把diff.txt應用到left.c文件上,命令結束后left.c與right.c中的內容是一樣的。
通過diff.txt,把right.c變成原來left.c的內容:
$ patch -R right.c diff.txt
上面執行的命令中多了一個-R,其代表的意思是把diff.txt采用反向的方式,應用到right.c上,命令結束后right.c與left.c中原來的內容是一樣的。
3,RCS:最早期的本地版本控制工具
RCS(Revision Control System)
RCS作為非常古老的版本工具,遠遠在SVN和已經退役的CVS之前,它的古老程度應該比Web開發的ASP前代的CGI還要更久遠。
如果想對版本管理實現方式進行深入研究的話,研究RCS是一種最為簡單的入手方式。
RCS采用把diff的集合,采用RCS自己的格式保存到磁盤中(可以通過diff -n left.c right.c產生RCS格式的diff內容),能通過這些diff集合,重新回到文件修改的任何歷史中的點。
4,CVS & SVN:集中式版本控制工具
CVS簡介
CVS(Concurrent Versions System)誕生與1985年,有史以來第一個被大規模使用的版本控制工具。CVS的出現讓工程師可以協同工作。
CVS存在的問題
不支持原子化提交,會導致客戶端向服務器端提交了不完整的數據,還有網絡傳輸效率低等。
SVN誕生
SVN(Subversion)目的是創建一個更好用的版本控制以取代CVS。優化了服務器上內容的存儲,實現了原子提交等。
SVN存在的問題
在局域網之外使用SVN,單是查看日志、提交數據等操作的延遲,就足以讓基于廣域網協同工作的團隊抓狂了。
集中式版本控制存在的問題
狹窄的提交通道
提交排隊,不能同時修改,提交缺乏質量控制。
缺乏代碼門禁,在本地代碼提交到服務器之間缺少檢查防護。一種解決方案:Rietveld提供旁路檢查
數據安全性差
單點故障
黑客攻擊
5,Git:Linus的第二個偉大作品
5.1,Git起源
Linux之父Linus是堅定的CVS反對者,他也同樣地反對SVN。2002年Linus頂著開源社區精英們的口誅筆伐,選擇了一個商業版本控制系統BitKeeper作為Linux內核的代碼管理工具。和CVS/SVN不同,BitKeeper是屬于分布式版本控制系統。
Git誕生大事件
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核心的源代碼。
5.2,集中式 VS 分布式
集中式 VS 分布式(1):記錄差異還是記錄快照
Git和其他版本控制系統(包括Subversion和近似工具)的主要差別在于Git對待數據的方法。
概念上來區分,其它大部分系統以文件變更列表的方式存儲信息。
這類系統(CVS、Subversion、Perforce、Bazaar等等)將保存的信息看作是一組基本文件和每個文件隨時間逐步積累的差異。
Git不按照以上方式對待或保存數據。反之,Git更像是把數據看作是對小型文件系統的一組快照。
每次提交更新,或在Git中保存項目狀態時,它主要對當時的全部文件制作一個快照并保存這個快照的索引。
為了高效,如果文件沒有修改,Git不再重新存儲該文件,而是只保留一個鏈接指向之前存儲的文件。Git對待數據更像是一個快照流。
集中式 VS 分布式(2):脆弱的中央庫 VS 強壯的分布庫
脆弱的中央庫
備份的重要性
集中式CVS存在單點故障,備份極其重要。
服務器壓力
基本上所有的操作需要與服務器交互,操作受限于帶寬,不能移動辦公。
安全性
集中式CVS假定服務器是安全的。假定成立嗎?存在單點故障,黑客攻擊等。
不適合開源項目
強調集中管理,適合人數不多的項目。
強壯的分布庫
全是服務器
數據最安全;無帶寬和性能瓶頸。
提交為本地操作
快;全離線操作;編碼不會被沖突打斷;能夠移動辦公。
數據的完整性
Git數據、提交全部使用SHA1哈希,以保證完整性,甚至提交可以使用PGP簽名。
工作模型
適合分布式開發,強調個體。
Git容災示例
kernel.org 2011 attack(2011.8-2011.11)
宇宙射線反轉磁盤一個比特的數據修復
5.3,選擇合適的版本控制工具
SVN不適合的領域
跨地域的協同開發
對代碼的高質量追求和代碼門禁
Git不適合的領域
不適合Word等二進制文檔的版本控制,因為:Git無鎖定/解鎖模式,故不能排他式修改。
整體的讀授權,不能將讀授權精細到目錄級別,解決方案:版本庫按照目錄拆分。
6,結語:Git是什么
Git是一個版本控制工具,而且是一個開源的分布式版本控制工具。
按照Linus本人的描述,Git的很多命令設計是來源于BitKeeper,但是Git有更多屬性:
極快的速度
簡單的設計
對非線性開發模式的強力支持(允許成千上萬并行開發的分支)
完全分布式
有能力高效管理類似Linux內核一樣的超大規模項目(速度和數據量)
7,小結
版本控制工具的發展歷史經過:原始人工維護狀態,本地RCS,集中式如CVS、SVN和分布式如Git。
版本控制工具提供了協作開發的能力,借助它們我們可以回到任何時間的代碼狀態。
集中式版本控制工具,幾乎所有的動作都需要服務器參與,并且數據安全性與服務器關系很大。
Git是分布式版本控制工具,除了與服務器之間進行按需同步之外,所有的提交操作都不需要服務器。
Git
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。