在学习 Git 的过程中,我认为 Git 就是一个工具,对于这个工具的学习始终需要结合真正的实际操作来进行。因此,我并不想将 Git 所有的内容都记录下来,只是记录学习 Git 中了解的一些重点。其余的内容可以在使用时遇到了再进行查询。
- Git Pro 官方网站上的 Git 教材,有众多例子解释,还有专门的中文翻译文档。
Git 直接记录快照
Git 和其它版本控制系统 (包括 Subversion 和近似工具)的主要差别在于 Git 对待数据的方式。
从概念上来说,其它大部分系统以文件变更列表的方式存储信息,这类系统(CVS、Subversion、Perforce 等等) 将它们存储的信息看作是一组基本文件和每个文件随时间逐步累积的差异(它们通常称作基于差异(delta-based)的版本控制)。

Git 不按照以上方式对待或保存数据。反之,Git 更像是把数据看作是对小型文件系统的一系列快照。在 Git 中,每当你提交更新或保存项目状态时,它基本上就会对当时的全部文件创建一个快照并保存这个快照的索引。为了效率,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。Git 对待数据更像是一个快照流。

Git 的文件状态
Git 有三种状态,文件可能处于其中之一。
- 已修改(modified)表示修改了文件,但还没保存到数据库中。
- 已暂存(staged)表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
- 已提交(committed)表示数据已经安全地保存在本地数据库中。
三个阶段
这会让我们的 Git 项目拥有三个阶段:工作区、暂存区以及 Git 仓库目录。

-
工作区:项目的某个版本独立提取出来的内容。这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。也就是我们打开 Git 仓库时除了 .git 目录以外的其他内容。
-
暂存区:本质是一个文件(.git/index),保存了下次将要提交的文件列表信息,一般在 Git 仓库目录中。按照 Git 的术语叫做“索引”,不过一般说法还是叫“暂存区”。暂存区并不是真的一个存储了修改的文件的存储区。假如我们将所有暂存的内容全部提交了之后,我们再使用
git ls-files命令,我们依旧能看到暂存区的文件列表。 -
Git 仓库目录:Git 用来保存项目的元数据和对象数据库的地方。这是 Git 中最重要的部分,从其它计算机克隆仓库时,复制的就是这里的数据。
常见工作流程
我们平常在使用 Git 时,工作流程一般包括但不限于以下几步:
- 修改工作目录中的内容,或者是删除,添加某些文件
- 将这些修改暂存
- 确定好修改完毕之后,将快照永久性地提交至 Git 仓库目录中
- 暂存操作
- 提交操作
暂存背后的操作为:为每一个文件计算校验和(使用 SHA-1 哈希算法),然后会把当前版本的文件快照保存到 Git 仓库中(Git 使用 blob 对象来保存它们),最终将校验和加入到暂存区域等待提交。
第一次提交:Git 会先计算每一个子目录的校验和, 然后在 Git 仓库中这些校验和保存为树对象。随后,Git 便会创建一个提交对象,它除了包含上面提到的那些信息外,还包含指向这个树对象(项目根目录)的指针。 如此一来,Git 就可以在需要的时候重现此次保存的快照。

后续提交:提交对象除了包含上述内容,还会包含一个指向父对象的指针
