Git
章节 ▾ 第二版

1.3 入门 - 什么是 Git?

什么是 Git?

那么,Git 究竟是什么?这一部分非常重要,因为如果你理解了 Git 是什么以及它的基本工作原理,那么有效地使用 Git 可能会变得更容易。在学习 Git 的过程中,尽量清空你对其他版本控制系统(如 CVS、Subversion 或 Perforce)的认知,这样做有助于避免在使用该工具时产生细微的混淆。尽管 Git 的用户界面与这些其他版本控制系统非常相似,但 Git 存储和处理信息的方式却大不相同,理解这些差异将有助于你在使用过程中避免混淆。

快照,而非差异

Git 与任何其他版本控制系统(包括 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 与几乎所有其他版本控制系统之间的重要区别。它使 Git 重新考虑了大多数其他系统从上一代系统复制的几乎所有版本控制方面。这使得 Git 更像是一个小型文件系统,在其之上构建了一些功能强大的工具,而不仅仅是一个版本控制系统。当我们介绍 Git 分支 时,我们将探讨以这种方式思考数据所获得的一些好处。

几乎所有操作都是本地的

Git 中的大多数操作只需要本地文件和资源即可运行——通常不需要来自网络上其他计算机的信息。如果你习惯于大多数操作都有网络延迟开销的集中式版本控制系统,那么 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