iT邦幫忙

2021 iThome 鐵人賽

DAY 18
2
Modern Web

【Git】從零開始學習 Git - 30 天的學習筆記系列 第 18

Day18|【Git】存在 .git 目錄裡的東西 - Commit 與 Tag(下)

在上一篇章節介紹過 Blob 物件與 Tree 物件後,接下來讓我們認識 Commit 與 Tag 分別是什麼吧!


Commit

  • 擁有 SHA1 檔名,儲存在 .git/objects 目錄下
  • Commit 只能紀錄 Tree,不能紀錄 Blob

在我們使用 git add 指令加至暫存區時,會產生一個 Blob 物件,紀錄檔案的內容;而在執行 git commit 指令時,會發現除了新增 Tree 型態的物件來儲存檔名之類的東西,同時又有其他 SHA-1 雜湊值出現,讓我們來看看這型態是什麼吧!

首先,我 git commit 了一個新的版本,可以看到 objects 目錄內新增了兩筆檔案。

$ git commit -m"紀錄訊息“

https://ithelp.ithome.com.tw/upload/images/20211001/20141010leh9mnHbbf.png

objects 目錄內新增了兩筆檔案

讓我們分別用指令查查看這兩個檔案的「型態」分別是什麼。

$ git cat-file -t [SHA-1 雜湊值(40字元)] #查看檔案型態

-t 參數為用來查看檔案的型態-p 參數則是查看檔案的內容

https://ithelp.ithome.com.tw/upload/images/20211001/20141010D2l8vuVBFZ.png

訊息提示發現有 Tree 物件與 Commit ,由於在前面章節有介紹過 Tree 物件,那麼這裡的 Commit 紀錄什麼內容呢?這就是我們接下來要了解的 Commit 物件。

首先我們先看一下 Commit 物件的內容:

$ git cat-file -p [Commit 物件的 40 字元] # 查看物件內容

-t 參數為用來查看檔案的型態-p 參數則是查看檔案的內容

https://ithelp.ithome.com.tw/upload/images/20211001/20141010slnS2bjFRQ.png

得到的提示會有:

tree e07ec1da62dfc5eaf8dee3964c2008eedaac7e35
parent dba939f16134c489b3d5ab198fd32cdc7db45e16
author cycChuyin <draw136also761@gmail.com> 1633096798 +0800
committer cycChuyin <draw136also761@gmail.com> 1633096798 +0800

update

分別紀錄著:

  1. 某個 Tree 物件。
  2. parent 表示指向上一次的 Commit
  3. 本次進行 Commit 的時間。
  4. 作者跟進行這次 Commit 的人
  5. 本次 Commit 的訊息

Parent 關係決成了 Git 線圖的線如何連接,除了作為起點的 Commit 之外,每個 Commit 都有 Parent,有時還會有兩個以上的 Parent。
因為有 Parent 紀錄前一個 Commit ,所有的 Commit 都可以串連起來,因此可以繼續透過 git cat-file 指令找到我們要的檔案或是檔名等等。

從上面結果來看,我們可以整理 Commit 、 Tree 、 Blob 之間的關係。

https://ithelp.ithome.com.tw/upload/images/20211001/20141010ItUnDWpDWy.png

如果又提交一次 Commit ,則關係變化會是:

https://ithelp.ithome.com.tw/upload/images/20211001/201410107UhogoDZPE.png

👉 整理目前為止的規則:

  • Commit 只會指向 Tree 物件。
  • Tree 物件會指向某個或多個 Blob 物件,同時也可 Tree 物件指向其他的 Tree 物件。
  • 除了第一次的 Commit 以外,其他的 Commit 都會指向他的前一次 Commit 物件。

⚠️ 特別注意:Commit、Tree、Blob 都是除存在 .git/objects 裡面,以 SHA1 當檔名的二進制檔案!


Tag

Tag 物件不會在我們執行 Commit 的過程中產出,而是需要透過我們手動把 Tag 貼在某個 Commit 上。

Tag 有分「輕量標籤」與「附註標籤」,這在後續的篇幅會介紹到。

首先讓我們在某個 Commit 上新增附註標籤:

$ git tag -a [Tag名稱] -m"紀錄訊息"

-a 參數為新增附註標籤之意

https://ithelp.ithome.com.tw/upload/images/20211001/20141010vSNF6ITOsa.png

此時在 Object 目錄裡會看到新增的檔案:

https://ithelp.ithome.com.tw/upload/images/20211001/20141010U8nb3aGRVa.png

讓我們看看這個檔案的型態跟內容分別是什麼呢?使用 git cat-file 指令搭配參數查看

$ git cat-file -t [SHA-1值] # 型態
$ git cat-file -p [SHA-1值] # 內容

https://ithelp.ithome.com.tw/upload/images/20211001/20141010fQrz0rqLPc.png

Tag 回饋訊息一樣包含了作者名稱、新增的日期、Tag 標籤名稱,以及當時紀錄的訊息。

但這裡需要注意的是:

⚠️ Tag 物件並不是以 SHA-1 當檔名的二進制檔案,而是紀錄著「Commit」的 SHA-1,並儲存在 .git/refs 裡面。

https://ithelp.ithome.com.tw/upload/images/20211001/20141010DCIADgvT7D.png

Tag 標籤不會隨著 Commit 新增而移動,他會固定指向那個 Commit


小結:

Git 四種物件的關係與執行指令時的關係:

  • git add:建立 Tree、Blob 物件。為提交時做準備。
    • 將檔案內容轉成 Blob 物件。目錄、檔名以 Tree 物件儲存。
    • Tree 物件指向 Blob 物件或是其他的 Tree 物件。
  • git commit:建立一個 Commit 的檔案儲存在 .git/objects。
    • Commit 會指向一個 Tree 物件
    • 除了第一個新增的 Commit 外,其餘 Commit 都會指向前一個 Commit 。
  • git tag:建立 Tag 檔案(Snnotated Tag),紀錄某個 Commit 的 SHA-1 值,並儲存在 .git/refs。
    • Tag 物件指向某個 Commit 物件

參考文章:Git 原理入門


上一篇
Day17|【Git】存在 .git 目錄裡的東西 - Blob 物件與 Tree 物件(上)
下一篇
Day19|【Git】開始使用分支 - git branch(基本常用指令)
系列文
【Git】從零開始學習 Git - 30 天的學習筆記30

尚未有邦友留言

立即登入留言