Git
章節 ▾ 第二版

10.1 Git 內部 - 水管與瓷器

您可能從較早的章節跳到本章,或者您可能一路按順序閱讀了整本書來到這裡。無論如何,我們將在此介紹 Git 的內部運作和實作。我們發現理解這些資訊對於了解 Git 的實用性和強大功能至關重要,但其他人則向我們表示,對於初學者來說,它可能會令人困惑且不必要的複雜。因此,我們將此討論設為本書的最後一章,以便您可以在學習過程的早期或稍後閱讀它。我們將決定權留給您。

既然您來到這裡,我們就開始吧。首先,如果還不清楚,Git 本質上是一個內容可定址的檔案系統,其上層寫了一個 VCS 使用者介面。您稍後會詳細了解這意味著什麼。

在 Git 的早期(主要是 1.5 版之前),使用者介面更加複雜,因為它強調這個檔案系統,而不是一個精緻的 VCS。在過去幾年中,UI 已被精簡,直到它像任何其他系統一樣乾淨易用。然而,關於早期 Git UI 複雜且難以學習的刻板印象仍然存在。

內容可定址檔案系統層非常酷,因此我們將在本章中首先介紹它。然後,您將了解傳輸機制和您可能最終必須處理的儲存庫維護任務。

水管與瓷器

本書主要介紹如何使用 Git 的 30 個左右的子指令,例如 checkoutbranchremote 等等。但是,由於 Git 最初是一個版本控制系統的工具組,而不是一個完整的使用者友善的 VCS,它有許多執行低階工作的子指令,並且設計為以 UNIX 風格串連在一起或從指令碼呼叫。這些指令通常稱為 Git 的「水管」指令,而更方便使用者使用的指令稱為「瓷器」指令。

正如您現在已經注意到的,本書的前九章幾乎完全處理瓷器指令。但是在本章中,您將主要處理較低階的水管指令,因為它們使您可以存取 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 檔案,以及 objectsrefs 目錄。這些是 Git 的核心部分。 objects 目錄儲存您資料庫的所有內容, refs 目錄儲存指向該資料中提交物件的指標(分支、標籤、遠端等), HEAD 檔案指向您目前已簽出的分支,而 index 檔案是 Git 儲存您的暫存區資訊的地方。您現在將詳細檢視每個部分,以了解 Git 如何運作。

scroll-to-top