-
1. 起步
-
2. Git 基礎
-
3. Git 分支
-
4. 伺服器上的 Git
- 4.1 協議
- 4.2 在伺服器上部署 Git
- 4.3 生成 SSH 公鑰
- 4.4 架設伺服器
- 4.5 Git Daemon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第三方託管服務
- 4.10 小結
-
5. 分散式 Git
-
A1. 附錄 A: Git 在其他環境
- A1.1 圖形介面
- A1.2 Visual Studio 中的 Git
- A1.3 Visual Studio Code 中的 Git
- A1.4 IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine 中的 Git
- A1.5 Sublime Text 中的 Git
- A1.6 Bash 中的 Git
- A1.7 Zsh 中的 Git
- A1.8 PowerShell 中的 Git
- A1.9 小結
-
A2. 附錄 B: 在應用程式中嵌入 Git
-
A3. 附錄 C: Git 命令
10.1 Git 內部原理 - 底層命令與高層命令
你可能是從前面的某個章節直接跳到本章,也可能是一直按順序讀到此處——無論是哪種情況,本章我們將深入探討 Git 的內部工作原理和實現細節。我們發現,理解這些資訊對於領會 Git 的強大和實用性至關重要,但也有人認為這對於初學者來說可能過於複雜和不必要。因此,我們將這一討論放在本書的最後一章,以便你可以在學習過程中選擇提前或稍後閱讀。這由你來決定。
既然你已經來到這裡,我們開始吧。首先,如果你還不清楚,Git 本質上是一個內容定址的檔案系統,其上層構建了一個版本控制系統(VCS)的使用者介面。稍後你將瞭解到這具體意味著什麼。
在 Git 的早期(大部分是 1.5 版本之前),使用者介面要複雜得多,因為它更強調這個檔案系統,而不是一個完善的版本控制系統。在過去的幾年裡,使用者介面得到了改進,變得和任何其他系統一樣簡潔易用;然而,關於早期 Git 使用者介面複雜難學的刻板印象依然存在。
內容定址的檔案系統層非常出色,因此我們將在本章首先介紹它;然後,你將瞭解傳輸機制以及你可能最終需要處理的倉庫維護任務。
底層命令與高層命令
本書主要介紹瞭如何使用 Git 的大約三十個子命令,例如 checkout
、branch
、remote
等。但由於 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 是如何操作的。