章节 ▾ 第二版

1.3 开始 - 什么是 Git?

什么是 Git?

那么,Git 究竟是什么呢?这是需要理解的重要章节,因为如果你了解 Git 是什么以及它的基本工作原理,那么有效地使用 Git 可能会容易得多。当你学习 Git 时,尽量清除你可能知道的关于其他 VCS(如 CVS、Subversion 或 Perforce)的事情,这样做将有助于你避免在使用该工具时出现细微的混淆。尽管 Git 的用户界面与其他这些 VCS 非常相似,但 Git 以非常不同的方式存储和思考信息,理解这些差异将有助于你避免在使用它时感到困惑。

快照,而非差异

Git 与任何其他 VCS(包括 Subversion 及其朋友)之间的主要区别在于 Git 思考其数据的方式。从概念上讲,大多数其他系统将信息存储为基于文件的更改列表。这些其他系统(CVS、Subversion、Perforce 等)将它们存储的信息视为一组文件以及每个文件随时间所做的更改(这通常被描述为*基于增量*的版本控制)。

Storing data as changes to a base version of each file
图 4. 将数据存储为对每个文件基本版本的更改

Git 不以这种方式思考或存储其数据。相反,Git 认为它的数据更像是一系列微型文件系统的快照。使用 Git,每次你提交或保存项目状态时,Git 基本上都会拍摄所有文件在那一刻的样子的照片,并存储对该快照的引用。为了提高效率,如果文件没有更改,Git 不会再次存储该文件,而只是存储一个指向之前已存储的相同文件的链接。Git 认为它的数据更像是一个**快照流**。

Git stores data as snapshots of the project over time
图 5. 将数据存储为项目随时间变化的快照

这是 Git 与几乎所有其他 VCS 之间的重要区别。这使得 Git 重新考虑了版本控制的几乎所有方面,而大多数其他系统都从上一代复制了这些方面。这使得 Git 更像是一个具有一些非常强大的工具构建在其顶部的微型文件系统,而不仅仅是一个 VCS。当我们讨论 Git 分支中的 Git 分支时,我们将探讨以这种方式思考数据所获得的一些好处。

几乎所有操作都是本地的

Git 中的大多数操作只需要本地文件和资源即可运行——通常不需要来自你网络上另一台计算机的信息。如果你习惯了 CVCS,其中大多数操作都有网络延迟开销,那么 Git 的这一方面会让你认为速度之神已经用超凡脱俗的力量祝福了 Git。因为你将项目的整个历史记录都保存在本地磁盘上,所以大多数操作似乎几乎是瞬间完成的。

例如,要浏览项目的历史记录,Git 不需要访问服务器以获取历史记录并为你显示它——它只需直接从你的本地数据库中读取它。这意味着你几乎可以立即看到项目历史记录。如果你想查看文件的当前版本与一个月前的版本之间引入的更改,Git 可以查找一个月前的文件并进行本地差异计算,而不必要求远程服务器执行它或从远程服务器拉取旧版本的文件以在本地执行它。

这也意味着,即使你离线或未连接 VPN,你几乎可以做任何事情。如果你乘坐飞机或火车,并且想做一点工作,你可以愉快地提交(记住,是提交到你的本地副本?)直到你有网络连接可以上传。如果你回到家并且无法使你的 VPN 客户端正常工作,你仍然可以工作。在许多其他系统中,这样做要么是不可能的,要么是非常痛苦的。例如,在 Perforce 中,当您未连接到服务器时,您无法执行太多操作;在 Subversion 和 CVS 中,您可以编辑文件,但您无法将更改提交到您的数据库(因为您的数据库处于离线状态)。这可能看起来没什么大不了的,但您可能会惊讶于它会产生多大的影响。

Git 具有完整性

Git 中的所有内容在存储之前都会进行校验和计算,然后通过该校验和来引用。这意味着在 Git 不知情的情况下,不可能更改任何文件或目录的内容。此功能构建在 Git 的最低层,并且是其理念不可或缺的一部分。您不会在传输过程中丢失信息或出现文件损坏,而 Git 无法检测到。

Git 用于此校验和计算的机制称为 SHA-1 哈希。这是一个 40 个字符的字符串,由十六进制字符(0-9 和 a-f)组成,并根据 Git 中文件或目录结构的内容计算得出。 SHA-1 哈希看起来像这样

24b9da6552252987aa493b52f8696cd6d3b00373

您将在 Git 中看到这些哈希值无处不在,因为它使用它们非常频繁。事实上,Git 将所有内容存储在其数据库中,不是按文件名,而是按其内容的哈希值。

Git 通常只添加数据

当您在 Git 中执行操作时,几乎所有操作都只是将数据添加到 Git 数据库。很难让系统做任何不可撤销的事情,或者以任何方式擦除数据。与任何 VCS 一样,您可能会丢失或搞砸您尚未提交的更改,但是当您将快照提交到 Git 后,就很难丢失,特别是如果您定期将数据库推送到另一个存储库。

这使得使用 Git 成为一种乐趣,因为我们知道我们可以进行实验而不用担心会严重搞砸事情。有关 Git 如何存储其数据以及如何恢复似乎丢失的数据的更深入信息,请参阅撤销操作

三种状态

现在注意了——如果您希望您的学习过程顺利进行,那么这里是关于 Git 需要记住的主要事项。Git 有三种主要状态,您的文件可以存在于其中:已修改已暂存已提交

  • 已修改意味着您已更改文件,但尚未将其提交到您的数据库。

  • 已暂存意味着您已标记已修改文件在其当前版本中,以进入您的下一个提交快照。

  • 已提交意味着数据已安全地存储在您的本地数据库中。

这导致了 Git 项目的三个主要部分:工作目录、暂存区和 Git 目录。

Working tree, staging area, and Git directory
图 6. 工作目录、暂存区和 Git 目录

工作目录是项目的一个版本的单个检出。这些文件从 Git 目录中的压缩数据库中拉出,并放置在磁盘上供您使用或修改。

暂存区是一个文件,通常包含在您的 Git 目录中,用于存储有关将进入您的下一个提交的信息。它在 Git 术语中的技术名称是“索引”,但短语“暂存区”同样适用。

Git 目录是 Git 存储项目的元数据和对象数据库的地方。这是 Git 最重要的部分,当您从另一台计算机克隆存储库时,会复制它。

基本的 Git 工作流程如下所示

  1. 您在工作目录中修改文件。

  2. 您有选择地暂存您希望成为下一个提交的一部分的更改,这会将这些更改添加到暂存区。

  3. 您执行提交,这将获取暂存区中的文件,并将该快照永久存储到您的 Git 目录中。

如果文件的特定版本位于 Git 目录中,则它被认为是已提交的。如果它已被修改并已添加到暂存区,则它被已暂存。如果自检出以来已更改但尚未暂存,则它被已修改。在Git 基础中,您将了解有关这些状态的更多信息,以及如何利用它们或完全跳过暂存部分。

scroll-to-top