章節 ▾ 第二版

10.1 Git 內部原理 - 底層命令與高層命令

你可能是從前面的某個章節直接跳到本章,也可能是一直按順序讀到此處——無論是哪種情況,本章我們將深入探討 Git 的內部工作原理和實現細節。我們發現,理解這些資訊對於領會 Git 的強大和實用性至關重要,但也有人認為這對於初學者來說可能過於複雜和不必要。因此,我們將這一討論放在本書的最後一章,以便你可以在學習過程中選擇提前或稍後閱讀。這由你來決定。

既然你已經來到這裡,我們開始吧。首先,如果你還不清楚,Git 本質上是一個內容定址的檔案系統,其上層構建了一個版本控制系統(VCS)的使用者介面。稍後你將瞭解到這具體意味著什麼。

在 Git 的早期(大部分是 1.5 版本之前),使用者介面要複雜得多,因為它更強調這個檔案系統,而不是一個完善的版本控制系統。在過去的幾年裡,使用者介面得到了改進,變得和任何其他系統一樣簡潔易用;然而,關於早期 Git 使用者介面複雜難學的刻板印象依然存在。

內容定址的檔案系統層非常出色,因此我們將在本章首先介紹它;然後,你將瞭解傳輸機制以及你可能最終需要處理的倉庫維護任務。

底層命令與高層命令

本書主要介紹瞭如何使用 Git 的大約三十個子命令,例如 checkoutbranchremote 等。但由於 Git 最初是一個版本控制系統的工具包,而不是一個完整的使用者友好型版本控制系統,它包含許多執行底層工作的子命令,這些命令被設計為 UNIX 風格的鏈式呼叫,或者從指令碼中呼叫。這些命令通常被稱為 Git 的“底層命令”(plumbing commands),而那些更使用者友好的命令則被稱為“高層命令”(porcelain commands)。

正如你現在已經注意到的,本書的前九章幾乎完全處理高層命令。但在本章中,你將主要處理更底層的命令,因為它們讓你能夠訪問 Git 的內部工作原理,並有助於展示 Git 是如何以及為何這樣做的。這些命令中的許多不適用於在命令列手動使用,而是作為構建新工具和自定義指令碼的構建塊。

當你在一個新目錄或現有目錄中執行 git init 時,Git 會建立 .git 目錄,Git 儲存和操作的幾乎所有內容都位於其中。如果你想備份或克隆你的倉庫,將這個單一目錄複製到其他地方就能滿足你幾乎所有需求。本章基本上都在處理你可以在這個目錄中看到的內容。下面是一個新初始化的 .git 目錄的典型樣子:

$ ls -F1
config
description
HEAD
hooks/
info/
objects/
refs/

根據你的 Git 版本,你可能會看到一些額外的內容,但這是一個全新 git init 倉庫——這是你預設看到的內容。description 檔案僅由 GitWeb 程式使用,所以不用擔心。config 檔案包含你的專案特定配置選項,而 info 目錄儲存一個用於被忽略模式的全域性排除檔案,這些模式是你不想在 .gitignore 檔案中跟蹤的。hooks 目錄包含你的客戶端或伺服器端鉤子指令碼,這些指令碼在Git 鉤子中詳細討論。

這剩下四個重要條目:HEAD 檔案和(尚未建立的)index 檔案,以及 objects 目錄和 refs 目錄。這些是 Git 的核心部分。objects 目錄儲存你資料庫的所有內容,refs 目錄儲存指向該資料中提交物件(分支、標籤、遠端等)的指標,HEAD 檔案指向你當前檢出的分支,而 index 檔案是 Git 儲存你的暫存區資訊的地方。現在我們將詳細檢視每個部分,瞭解 Git 是如何操作的。

scroll-to-top