我們之前學了Git的三個物件:提交物件
、樹物件
、資料物件
。
我們假設現在有一個工作目錄,裡面進行了三次提交,包括一次新增檔案和兩次對檔案的修改。
blob
物件來儲存它們),最後將校驗和加入到暫存區域等待提交。git commit
命令進行提交操作時,Git會先計算每一個子目錄的校驗和, 然後在 Git 倉庫中這些校驗和儲存為樹物件。此時的Git倉庫中就會有五個Git物件:三個 blob
物件(儲存著檔案快照)、一個 樹 物件 (記錄著目錄結構和 blob
物件索引)以及一個 提交 物件(包含著指向前述樹物件的指標和所有提交資訊)。
這個物件之間的關係,如下圖:
總結提交物件
、樹物件
、資料物件
之間的關係:
Tree
物件。(對Tree
物件的封裝,單方向一對一)Tree
物件,裡面包含子Tree
物件和Blob
物件。子Tree
物件還可以繼續包含子Tree
物件和Blob
物件。Tree
物件對應檔案系統中的目錄+檔名
,Blob
物件對應著檔案中的內容,這就是Git中資料儲存的形式。Blob
物件對應著一個檔案某一時刻的版本。三種物件之間的關係如下圖:
那麼問題來了:每一個Commit
物件,是怎樣的組合到一起的呢?
Git版本管理系統是以時間線來對版本進行管理的,這條時間線上會有很多的時間節點,這些時間節點就是一個個的Commit
物件。
即:Git的每次提交,都會自動把它們串成一條時間線,這條時間線就是一個分支。
如下圖所示:每一次提交產生的提交物件,會包含一個指向上次提交物件(父物件)的指標,這樣就形成了一條鏈狀結構,就相當於一條線。
Git的分支,其實本質上僅僅是指向提交物件的可變指標。
Git倉庫初始化之後,會預設建立一個master
分支,即主分支。
如果沒有新建分支,那麼就只有一條時間線,即只有一個分支,master
分支(主分支)。
每次提交操作之後,會生成新的提交物件(如上圖), master
分支會在每次提交時自動向前移動。(也就是自動指向最新的提交物件)
我們在學習Git的時候,常常會看到HEAD
這個名稱,它指的是什麼呢?
Git中維護一個名為HEAD
的參照變數,我們將此變數稱為指標,它的目的是參照或指向本地版本庫中的特定提交。
當我們進行新的提交時,指標將改變或移動,以指向新的提交。
HEAD
始終指向Git本地版本庫中當前正在工作的分支的尖端(即最新一次提交)。
概括來說:HEAD
是對當前分支中,最後一次提交的參照。(可以將HEAD
想象為是,當前分支最後一次提交的別名。)
再繼續:
HEAD
嚴格來說不是指向提交,而是指向master
(分支),master
(分支)才是指向具體的提交,所以,HEAD
指向的就相當於是當前分支的最新一次提交。
如下圖所示:
Git用master
指向最新的提交,再用HEAD
指向master
,就能確定當前分支,以及當前分支的提交點。
(當然HEAD
還有一種分離的狀態,我們以後單說,關於HEAD
就先理解到這裡就很詳細了)