-
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 之前),用户界面更加复杂,因为它强调的是这个文件系统,而不是一个完善的 VCS。在过去的几年里,UI 经过了改进,直到它像任何其他系统一样干净且易于使用;然而,关于早期 Git UI 复杂且难以学习的刻板印象仍然存在。
内容寻址的文件系统层非常酷,因此我们将在本章中首先介绍它;然后,您将了解传输机制和存储库维护任务,您最终可能需要处理这些任务。
底层命令与上层命令
本书主要介绍如何使用 Git 的 30 个左右的子命令,例如 checkout
、branch
、remote
等等。但是,由于 Git 最初是一个版本控制系统的工具包,而不是一个完整的用户友好的 VCS,因此它有许多执行底层工作的子命令,这些子命令被设计成以 UNIX 风格链接在一起或从脚本中调用。这些命令通常被称为 Git 的 “底层(plumbing)” 命令,而更用户友好的命令被称为 “上层(porcelain)” 命令。
正如你现在已经注意到的,本书的前九章几乎完全都在讲解 porcelain 命令。但是在本章中,你将主要学习底层 plumbing 命令,因为它们可以让你访问 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
目录包含你的客户端或服务器端 hook 脚本,这在 Git Hooks 中有详细讨论。
这留下了四个重要的条目:HEAD
和(尚未创建的)index
文件,以及 objects
和 refs
目录。这些是 Git 的核心部分。 objects
目录存储你的数据库的所有内容,refs
目录存储指向该数据中的 commit 对象的指针(分支、标签、远程等等),HEAD
文件指向你当前检出的分支,index
文件是 Git 存储你的暂存区信息的地方。你现在将详细研究这些部分,以了解 Git 如何运作。