-
附录 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 总结
-
附录 B: 将 Git 嵌入应用程序
-
附录 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 的“管道”命令,而更友好的命令被称为“瓷器”命令。
正如您现在已经注意到的,本书的前九章几乎完全处理“瓷器”命令。但在本章中,您将主要处理更低级别的“管道”命令,因为它们让您能够访问 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 的操作方式。