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