首先,我们先回顾一下,Git 的实现基础原理,Git 保存的不是文件差异或者变化量,而只是一系列文件快照.
/ 01 /
Git 和其他版本控制系统的主要差别在于,Git直接记录快照,而非差异比较。也就是说Git 只关心文件数据的整体是否发生变化,而大多数其他系统则关心的是文件内容的具体差异。
Git 并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接用。让我们用一张图来解释一下:
实框,代表该文件的代码变化了,生成新的快照,虚框代表和上次相比没有发生变化,对上一次保存的快照做一个链接。
/ 02 /
git add README test.rb LICENSE
在 Git 中提交时,会保存一个提交(commit)对象,该对象包含一个指向暂存内容快照的指针。为直观起见,我们假设在工作目录中有三个文件(README/test.rb/LICENSE),准备将它们暂存后提交。暂存操作(add)会对每一个文件计算校验和(SHA-1 哈希字串),然后把当前版本的文件快照保存到 Git 仓库中(Git 使用 blob 类型的对象存储这些快照),并将校验和加入暂存区域。
/ 03 /
git commit -m 'initial commit of my project'
当使用 git commit 新建一个提交对象前,Git 会先计算每一个子目录(本例中就是项目根目录)的校验和,然后在 Git 仓库中将这些目录保存为树(tree)对象。之后 Git 创建的提交对象,除了包含相关提交信息以外,还包含着指向这个树对象(项目根目录)的指针,如此它就可以在将来需要的时候,重现此次快照的内容了。
现在,Git 仓库中有五个对象:三个表示文件快照内容的 blob 对象;一个记录着目录树内容及其中各个文件对应 blob 对象索引的 tree 对象;以及一个包含指向 tree 对象(根目录)的索引和其他提交信息元数据的 commit 对象。概念上来说,仓库中的各个对象保存的数据和相互关系看起来如图所示
/ 04 /
关注我们,遇见属于你的精彩!
相关文章:
-
2021-11-12
-
2021-10-24
-
2022-01-02
-
2021-10-18
-
2022-02-24
-
2021-05-31
-
2022-12-23
猜你喜欢
-
2021-12-06
-
2022-12-23
-
2022-01-20
-
2021-08-10
-
2021-07-05
-
2022-12-23
-
2021-11-06
相关资源
-
下载
2023-01-25
-
下载
2023-02-23
-
下载
2022-12-17
-
下载
2023-01-24
-
下载
2022-12-22