Git Step by Step (3):Git物件模型

發表於2015-03-05

前面一篇文章介紹了本地倉庫的一系列操作,下面我們將進一步瞭解Git的工作原理,介紹Git物件模型。

剛開始使用Git的時候,對Git物件模型、工作原理並不理解,但是經過一段時間的使用、熟悉之後,然後再來理解這些內容就比較容易了。

下面開始介紹Git物件,然後通過一個例項展示Git物件模型。

Git物件

在Git系統中有四種型別的物件,所有的Git操作都是基於這四種型別的物件。

  • “blob”:這種物件用來儲存檔案的內容。
  • “tree”:可以理解成一個物件關係樹,它管理一些”tree”和 “blob”物件。
  • “commit”:只指向一個”tree”,它用來標記專案某一個特定時間點的狀態。它包括一些關於時間點的後設資料,如時間戳、最近一次提交的作者、指向上次提交(初始commit沒有這一項)。
  • “tag”:給某個提交(commit) 增添一個標記。

 

SHA1雜湊值

上面我們介紹了Git物件,在Git系統中,每個Git物件都有一個特殊的ID來代表這個物件,這個特殊的ID就是我們所說的SHA1雜湊值。

SHA1雜湊值是通過SHA1演算法(SHA演算法家族的一種)計算出來的雜湊值,對於內容不同的物件,會有不同的SHA1雜湊值。如果你讀過前面一篇文章,就肯定還記得我們是怎麼根據commit id撤銷更新的,這裡的commit id就是一個SHA1雜湊值。

 

Git物件模型例項

下面我們通過一個例子來認識一下上面的四種物件,為了更加清楚,這裡將一步步展示經過一系列操作後物件的關係變化。

第一步:新建一個倉庫,新增一個”calc.py”的檔案

通過”git log –pretty=raw”可以得到每個commit的SHA1雜湊值,也可以得到這個commit對應的tree的雜湊值。

所以,一個commit物件一般包含以下資訊:

  • 代表commit的雜湊值
  • 指向tree 物件的雜湊值
  • 作者
  • 提交者
  • 註釋

在Git物件模型的研究中,有一個很有用的命令”git cat-file”,可以通過這個命令查詢特定物件的資訊:

  • git cat-file -t key:通過一個物件的雜湊值可以通過這條命令檢視物件的型別(blob、tree、commit或tag)
  • git cat-file -p key:通過物件的雜湊值可以檢視這個物件的內容

下面我們看一下在這次提交中commit、tree物件的型別和內容。這裡可以看到,在這一次的commit中tree物件的內容指向一個blob物件。

同樣,我們可以檢視blob物件的型別和內容,這裡可以看到blob的內容就是我們要提交的檔案的內容。

所以,根據上面的一些資料,我們可以看到在這一次的提交中產生了三個物件,同時看到了commit、tree、blob三個物件的關係如下:

第二步:更新”calc.py”檔案,新增sub函式

繼續使用”git log –pretty=raw”檢視commit log。

同樣通過”git cat-file”我們可以看到每一個物件的型別和內容,這裡就不一步一步上圖了,直接給出所有的物件關係。

這裡需要注意的一點,Perforce、SVN和CVS屬於“增量檔案系統” (Delta Storage systems),它們每次只儲存提交(commit)之間的差異。而對於Git,它會把你的每次提交的檔案的全部內容(snapshot)都會記錄下來。

第三步:增加一個”app.py”;增加”advance”資料夾,包括”__init__.py”和”calc.py”

同樣的方式,我們可以得到一張更復雜的物件關係圖:

 

總結

Git物件模型就像是Git系統特有的檔案系統,以特定的方式儲存更新的內容、後設資料以及版本歷史資訊。

通過Git物件模型進一步熟悉了Git的工作原理,相信有了這些知識,我們就可以分析git命令背後到底發生了什麼。

相關文章