天天看點

《Git版本控制管理(第2版)》——4.2 對象庫圖示

本節書摘來自異步社群《git版本控制管理(第2版)》一書中的第4章,第4.2節,作者:【美】jon loeliger , matthew mccullough著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

讓我們看看git的對象之間是如何協作來形成完整系統的。

blob對象是資料結構的“底端”;它什麼也不引用而且隻被樹對象引用。在接下來的圖裡,每個blob由一個矩形表示。

樹對象指向若幹blob對象,也可能指向其他樹對象。許多不同的送出對象可能指向任何給定的樹對象。每個樹對象由一個三角形表示。

一個圓圈表示一個送出對象。一個送出對象指向一個特定的樹對象,并且這個樹對象是由送出對象引入版本庫的。

每個标簽由一個平行四邊形表示。每個标簽可以指向最多一個送出對象。

分支不是一個基本的git對象,但是它在命名送出對象的時候起到了至關重要的作用。把每個分支畫成一個圓角矩形。

圖4-1展示了所有部分如何協作。這張圖顯示了一個版本庫在添加了兩個檔案的初始送出後的狀态。兩個檔案都在頂級目錄中。同時它們的master分支和一個叫v1.0的标簽都指向id為1492的送出對象。

《Git版本控制管理(第2版)》——4.2 對象庫圖示

現在,讓我們使事情變得複雜一點。保留原來的兩個檔案不變,添加一個包含一個檔案的新子目錄。對象庫就如圖4-2所示。

《Git版本控制管理(第2版)》——4.2 對象庫圖示

就像前一張圖裡,新送出對象添加了一個關聯的樹對象來表示目錄和檔案結構的總狀态。在這裡,它是id為cafed00d的樹對象。

因為頂級目錄被添加的新子目錄改變了,頂級樹對象的内容也跟着改變了,是以git引進了一個新的樹對象:cafed00d。

然而,blob對象dead23和feeb1e在從第一次到第二次送出的時候沒有發生變化。git意識到id沒有變化,是以可以被新的cafed00d樹對象直接引用和共享。

請注意送出對象之間箭頭的方向。父送出在時間上來得更早。是以,在git的實作裡,每個送出對象指回它的一個或多個父送出。很多人對此感到困惑,因為版本庫的狀态通常畫成反方向:資料流從父送出流向子送出。

第6章擴充了這些圖來展示版本庫的曆史是如何建立和被不同指令操作的。