《Git版本控製管理(第2版)》——1.2 Git的誕生
本節書摘來自異步社區《Git版本控製管理(第2版)》一書中的第1章,第1.2節,作者:【美】Jon Loeliger , Matthew McCullough著,更多章節內容可以訪問雲棲社區“異步社區”公眾號查看
1.2 Git的誕生
通常來說,當工具跟不上項目需求時,開發人員就會開發一個新的工具。實際上,在軟件領域裏,創造新工具經常看似簡單和誘人。然而,鑒於市麵上已經有了相當多的VCS,決定再創造一個卻應該是要深思熟慮的。不過,如果有著充分的需求、理性的洞察以及良好的動機,則完全可以創造一個新的VCS。
Git就是這樣一個VCS。它被它的創造者(Linus,一個脾氣急躁又經常爆出冷幽默的人)稱作“從地獄來的信息管理工具”。盡管Linux社區內部政治性的爭論已經淹沒了關於Git誕生的情形和時機的記憶,但是毋庸置疑,這個從烈火中誕生的VCS著實設計優良,能夠勝任世界範圍內大規模的軟件開發工程。
在Git誕生之前,Linux內核開發過程中使用BitKeeper來作為VCS。BitKeeper提供當時的一些開源VCS(如RCS、CVS)所不能提供的高級操作。然而,在2005年春天,當BitKeeper的所有方對他們的免費版BitKeeper加入了額外的限製時,Linux社區意識到,使用BitKeeper不再是一個長期可行的解決方案。
Linus本人開始尋找替代品。這次,他回避使用商業解決方案,在自由軟件包中尋找。然而,他卻發現,在現有的自由軟件解決方案中,那些在選擇BitKeeper之前曾經發現的,導致他放棄自由軟件解決方案的一些限製和缺陷如今依然存在。那麼,這些已經存在的VCS到底存在什麼缺陷?Linus沒能在現有VCS中找到的有關特性到底是哪些?讓我們來看看。
有助於分布式開發
分布式開發有很多方麵,Linus希望有一個新的VCS能夠盡可能覆蓋這些方麵。它必須允許並行開發,各人可以在自己的版本庫中獨立且同時地開發,而不需要與一個中心版本庫時刻同步(因為這樣會造成開發瓶頸)。它必須允許許多開發人員在不同的地方,甚至是離線的情況下,無障礙地開發,
能夠勝任上千開發人員的規模
僅僅支持分布式開發模型還是不夠的。Linus深知,每個Linux版本都凝聚了數以千計開發人員的心血。所以新的VCS必須能夠很好地支持非常多的開發人員,無論這些開發人員工作在整個項目相同還是不同的部分。當然,新的VCS也必須能夠可靠地將這些工作整合起來。
性能優異
Linus決心要確保新的VCS能夠快速並且高效地執行。為了支持Linux內核開發中大量的更新操作,他知道不管是個人的更新操作,還是網絡傳輸操作,都需要保證執行速度。為了節約存儲空間,從而節約傳輸時間,需要使用“壓縮”和“差異比較”技術。另外,使用分布式開發模型,而非集中式模型,同樣也確保了網絡的不確定因素不會影響到日常開發的效率。
保持完整性和可靠性
因為Git是一個分布式版本控製係統,所以非常需要能夠絕對保證數據的完整性和不會被意外修改。那如何確定,在從一個開發人員到另一個開發人員的過程中,或者從一個版本庫到另一個版本庫的過程中,數據沒有被意外修改呢?又如何確定版本庫中的實際數據就是認為的那樣?
Git使用一個叫做“安全散列函數”(SHA1)的通用加密散列函數,來命名和識別數據庫中的對象。雖然也許理論上不是絕對的,但是在實踐中,已經證實這是足夠可靠的方式。
強化責任
版本控製係統的一個關鍵方麵,就包括能夠定位誰改動了文件,甚至改動的原因。Git對每一個有文件改動的提交(Git把一個曆史版本叫做一個“提交”)強製使用“改動日誌”。“改動日誌”中存儲的信息由開發人員、項目需求、管理策略等決定。Git確保被VCS管理的文件不會被莫名地修改,因為Git可以對所有的改動進行責任追蹤。
不可變性
Git版本庫中存儲的數據對象均為不可變的。這意味著,一旦創建數據對象並把它們存放到數據庫中,它們便不可修改。當然,它們可以重新創建,但是重新創建隻是產生新的數據對象,原始數據對象並不會被替換。Git數據庫的設計同時也意味著存儲在版本數據庫中的整個曆史也是不可變的。使用不可變的對象有諸多優勢,包括快速比較相同性。
原子事務
有了原子事務,可以讓一係列不同但是相關的操作要麼全部執行要麼一個都不執行。這個特性可以確保在進行更新或者提交操作時,版本數據庫不會陷入部分改變或者破損的狀態。Git通過記錄完整、離散的版本庫狀態來實現原子事務。而這些版本庫狀態都無法再分解成更小的獨立狀態。
支持並且鼓勵基於分支的開發
幾乎所有的VCS都支持在同一個項目中存在多個“支線”。例如,代碼變更的一條支線叫做“開發”,而同時又存在另一條支線叫做“測試”。每個VCS同樣可以將一條支線分叉為多條支線,在以後再將差異化後的支線合並。就像大多數VCS一樣,Git把這樣的支線叫做“分支”,並且給每個分支都命名。
伴隨著分支的就是合並。Linus 不僅希望通過簡單的分支功能來促進豐富的開發分支,還希望這些分支的合並可以變得簡單容易。因為通常來說,分支的合並是各VCS使用中最為困難和痛苦的操作,所以,能夠提供一個簡單、清晰、快速的合並功能,是非常必要的。
完整的版本庫
為了讓各個開發人員不需要查詢中心服務器就可以得到曆史修訂信息,每個人的版本庫中都有一份關於每個文件的完整曆史修訂信息就非常重要。
一個清晰的內部設計
即使最終用戶也許並不關心是否有一個清晰的內部設計,對於Linus以及其他Git開發人員來說,這確實非常重要。Git的對象模型擁有者簡單的結構,並且能夠保存原始數據最基本的部分和目錄結構,能夠記錄變更內容等。再將這個對象模型和全局唯一標識符技術相結合,便可以得到一個用於分布式開發環境中的清晰數據對象。
免費自由(Be free, as in freedom)
——Nuff曾說過。
有了創造一個新VCS的清晰理由後,許多天才軟件工程師一起創作出了Git。需求是創新之母!
最後更新:2017-06-01 17:01:33