探秘Git对象,commit,tree,blob

探秘Git对象,commit,tree,blob


要想真正理解Git对象,首先要知道暂存区(.git/index)实际上是一个包含文件索引的目录树,而真正存储数据的地方是(.git/object),而比如HEAD->master分支,简单来说就是一系列指针,指向objects的数据或者叫对象,而objects是一个简单的key-value数据库


首先初始化一个git仓库,并进入到.git/object目录下一探究竟

进入到objects目录,可以看到 Git 对 objects 目录进行了初始化,并创建了 packinfo 子目录,但均为空


然后创建一个文件,写入v1,并进行add,此刻先不要commit

会发现,新增了62文件夹,以及文件夹下的一串,其实就是SHA128哈希函数生成的hashcode

而且得出了一个结论: 添加到暂存区的改动,实际数据是存储到.git/objects下了


可以用git cat-file来查看这个hashcode对应的文件类型

git cat-file -p 626799f0f   //查看文件内容
git cat-file -t 626799f0f		//查看文件类型

可以看到,类型为blob,这就是Git的数据对象,接下来我们创建一个空文件夹并add到暂存区

objects文件夹下并没有新内容增加,这是因为对于Git来说,文件夹只是一个索引,直接存到.git/index了


然后进行提交commit,在观察该目录下的改动

这次多了出两个hashcode,分别看这两个hashcode的类型和内容

其中一个为tree对象,通过-p可以看出其内容为一个blob数据对象,而这个blob的内容就是我们一开始存的字符v1

然后我们创建一个名为folder的文件夹,并在folder下创建file2.txt写入v2

发现多处了若干个hashcode,其中有commit类型的,通过-p查看其内容,其中包含一个b99开头的tree,查看这个tree的tree发现里面又是blob和tree,这正好对应我们刚才创建的目录,因此Git的存储结构如下图

一个commit对象,会包含其父节点commit引用,还有根节点的tree的引用,tree下面又包含若干blob和tree,对应目录下的文件和文件夹,具体一点就是下图这种模型

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值