Git 的特點—— Git 學習筆記 02

ARM的程式設計師敲著詩歌的夢發表於2020-04-04

Git 簡史

眾所周知,Linux 核心開源專案有著為數眾多的參與者。這麼多人在世界各地為 Linux 編寫程式碼,那Linux 的程式碼是如何管理的呢?事實是在 2002 年以前,世界各地的開發者把原始碼通過 diff 的方式發給 Linus,然後由 Linus 本人手工合併。

你也許會問,難道那時候就沒有版本控制系統嗎?有是有,比如 CVS、SVN. 雖然它們免費且開源,可是用起來速度太慢,且必須聯網才能使用。也有一些商用的版本控制系統,雖然比 CVS、SVN 好用,可是要收費,這和 Linux 的開源精神不符。

到了 2002 年,Linux 核心已經發展了十年有餘。程式碼庫之龐大很難再讓 Linus 繼續通過手工方式來管理了。於是 Linus 選擇了一個商業版本控制系統 BitKeeper(由 BitMover 公司開發,屬於分散式版本控制系統)。出於人道主義精神,BitMover 公司授權 Linux 社群免費使用 BitKeeper.

2005 年,BitMover 公司同 Linux 核心開源社群的合作關係結束,他們收回了 Linux 核心社群
免費使用 BitKeeper 的權力。這可怎麼辦呢?自己動手,豐衣足食。Linus 決定自行開發版本控制系統。僅用十天的時間,他就編寫出了 git 的第一個版本(大神就是大神啊)。一個月以後,Linux 核心的原始碼已經由 git 管理了!

Git 的特點

直接記錄快照,而非差異比較

git 和其它版本控制系統(包括 Subversion 和近似工具)的主要差別在於 git 對待資料的方法。其它系統(比如 CVS、Subversion、Perforce、Bazaar 等等)將它們儲存的資訊看作是一組基本檔案和每個檔案隨時間逐步累積的差異。如下圖所示:
在這裡插入圖片描述

但是 git 不按照以上方式對待或儲存資料。 反之,git 更像是把資料看作是對小型檔案系統的一組快照。 每次你提交更新,git 都會對當時的全部檔案製作一個快照並儲存這個快照的索引。 為了高效,如果檔案沒有修改,git 不再重新儲存該檔案,而是用一個連結指向之前儲存的檔案。

git 對待資料更像是一個 快照流
(下圖中虛線表示之前儲存過,所以不重複儲存。)
這裡寫圖片描述

近乎所有操作都是本地執行

在 git 中的絕大多數操作都只需要訪問本地檔案和資源。比起所有操作都有網路延時開銷的集中式版本控制系統,Git 在這方面會讓你感到“迅雷不及掩耳盜鈴兒響叮噹”。 因為你在本地磁碟上就有專案的完整歷史,所以大部分操作看起來瞬間完成。

這也意味著在斷網環境下,幾乎可以進行任何操作。 比如你在飛機上對程式碼做了一些修改,你能愉快地提交,直到有網路連線時再上傳。 換做用 Subversion 或 CVS,你只能修改檔案,但不能向資料庫提交修改(因為你沒網)。

保證完整性

git 中所有資料在儲存前都計算校驗和,然後以校驗和來引用。 這意味著不可能在 git 不知情的情況下更改任何檔案目錄。若你在傳送過程中丟失資訊或損壞檔案,Git 就能發現。

git 用以計算校驗和的機制叫做 SHA-1 雜湊。 這是一個由 40 個十六進位制字元組成的字串,基於 git 中檔案的內容或目錄結構計算出來。 SHA-1 雜湊看起來是這樣的:

24b9da6552252987aa493b52f8696cd6d3b00373

git 中使用這種雜湊值的情況很多。實際上,git 資料庫中儲存的資訊都是以檔案內容的雜湊值來索引,而不是檔名,也不是 Subversion 那樣連續的版本號。

一般只新增資料

你執行的 git 操作,幾乎只往 git 資料庫中增加資料。 很難讓 git 執行任何不可逆操作,或者讓它以任何方式清除資料。 同別的 VCS 一樣,未提交更新時有可能丟失或弄亂修改的內容;但是一旦你提交快照到 git 中,就難以再丟失資料。如果你還定期把資料推送到其他倉庫,那麼你的資料就更難弄丟了。


參考資料

[1] https://git-scm.com/book/zh/v2/起步-Git-基礎
[2] https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

相關文章