gitblobtreecommit
Posted 绝世好阿狸
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gitblobtreecommit相关的知识,希望对你有一定的参考价值。
git存储
三种类型:commit、tree与blob
blob指的是文件,一个文件的一个版本对应一个blob对象,比如v1的版本的a.txt文件是一个blob,然后对a.txt进行了修改,重新commit为v2版本后,会多一个v2版本的blob,也就是说同一个文件,有几个版本就有几个blob对象
这里也引申一下git的存储机制。首先git需要管理版本,那么需要能够恢复到之前的版本,所以可以肯定的是需要存储整个git仓库的每一个版本,有两个思路,一是存diff;二是存全量文件,也就是存快照。git使用的是后者,及快照机制。
blob是最小的单位,不同的blob对于git而言,不看文件名,而看文件内容的sha1哈希值。这个哈希值也会作为blob的文件名。
tree指的是目录,一个tree对象内部聚合了另一些tree或者blob。tree本身也会有自己的哈希值,这个哈希值也是这个tree的名字。
commit指的是一个提交,一个commit可以理解为某一个版本下的仓库的各个文件以及文件夹的快照。相当于聚合了这个版本下的blob以及tree对象。commit同时也会包含提交信息以及parent的commit。
那么考虑一下,我们在当前版本下修改了一个文件,git仓库会发生什么变化?
首先会多一个新版本的blob对象,然后从顶级目录到这个文件的所有目录,都需要新建一个对应的tree,因为内部的文件发生了变化,所以整条链路的快照都需要新建;其余的平级的目录或者文件的快照无需变化。然后新建一个commit对象,聚合这些新的tree以及blob。
参考:https://git-scm.com/book/en/v2/Git-Internals-Git-Objects
补充命令:
git cat-file -t hash:查类型
git cat-file -p hash:查内容
以上是关于gitblobtreecommit的主要内容,如果未能解决你的问题,请参考以下文章