【git】blob、tree、commit

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:查内容
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值