-
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 是如何操作的。