iT邦幫忙

2025 iThome 鐵人賽

DAY 2
0
Software Development

深入一點點認識 Git系列 第 2

Day 2-深入一點點認識 Git:上層的瓷器(Porcelain)與底層的管路(Plumbing)指令

  • 分享至 

  • xImage
  •  

在我們初學 git 時,遇到的指令有 git addgit commitgit branchgit push 等等,再透過 git statusgit log 等指令,就可以觀察剛剛做的事情造成的影響。

然而,下完這些指令到底是「如何造成變化」的,我們不得而知、也確實不用真的知道就可以讓專案進行下去,這些指令被稱為對使用者友善的「上層指令(porcelain commands)」,其字面意思是「瓷器指令」,可以想成廁所馬桶,瓷器(還有附著在瓷器上的)部分是給人用的,我們只要按下沖水鈕,就可以沖馬桶,完全不必知道按下沖水紐之後,馬桶內部發生了什麼事。

至於「底層指令(plumbing commands)」,字面意思為「管路指令」,再以馬桶為例,就可以想成那些被瓷器包起來的管路,唯有實際接觸管路,我們才得以看到內部運作,並從中做更細微的操作與調整,不再只是單純沖水完等水箱補水而已。

https://ithelp.ithome.com.tw/upload/images/20250902/20178513ZGYiru2v2b.png
上層與底層指令類比對照(圖片取自維基百科)

底層指令範例

回到前一篇文提到的範例,我們知道:

  1. git add
  2. git commit

這兩個是上層指令,git add 是把檔案先放到預存區(staging area)、git commit 是形成一筆 commit 快照(snapshot)。至於:

  1. git hash-object
  2. git update-index - add
  3. git write-tree
  4. git commit-tree
  5. git update-ref HEAD

這些就是底層指令,其作用分別為:

  1. git hash-object:產生一組 blob 物件,並計算物件 ID。
  2. git update-index - add:把第 1. 步產生的 blob 物件放進預存區。
  3. git write-tree:把預存區的檔案拿來做出 tree 物件。
  4. git commit-tree:從指定的 tree 物件建立 commit 物件。
  5. git update-ref HEAD:把 HEAD 這個參考(reference)指向 4. 做出來的 commit 物件。

怎麼越解釋越看不懂,那一堆奇奇怪怪的物件是什麼?參考又是什麼?緊接著下一篇,我們將一同探索一個 commit 的內部結構。

小結

Git 的指令分兩種,一是上層的「瓷器」指令,對使用者較友善;二是底層的「管路」指令,可以操作比較底層的細節。

參考資料

  1. 10.1 Git Internals - Plumbing and Porcelain
  2. git-hash-object
  3. git-update-index
  4. git-write-tree
  5. git-commit-tree
  6. git-update-ref

上一篇
Day 1-深入一點點認識 Git:關於此系列文的內容及難度定位
下一篇
Day 3-深入一點點認識 Git:什麼是 Git 物件?
系列文
深入一點點認識 Git4
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言