Git对象

本文详细介绍了Git的核心原理,包括数据对象(blob)、树对象(tree)和提交对象(commit),展示了如何通过githash-object命令操作和存储内容,以及Git对象的存储结构和版本控制过程。
摘要由CSDN通过智能技术生成

  Git的本质是一个内容寻址文件系统,其核心部分是一个key-value的数据库,能够存储任意类型的内容,并通过返回的key来检索该内容。Git的对象有三种:数据对象(blob object)、树对象(tree object)、提交对象(commit object),可以通过git hash-object等命令来演示内容的保存和检索。

1、数据对象(blob object)

首先,通过git init初始化一个版本库
在这里插入图片描述
通过git hash-object命令来存储对象,通过git cat-file命令从Git那里取回数据,为cat-file命令指定-p选项可使该命令自动判断内容的类型,并显示格式友好的内容:
在这里插入图片描述
git hash-object命令中的 -w表示将输入的内容写入到数据库中,若不加此参数只会输出key,不会存储输入的内容:
在这里插入图片描述
–stdin 表示从标准输入中读取的内容,若不加此参数就需要指定文件。创建一个文件,并将文件的内容写入数据对象:在这里插入图片描述

2、树对象(tree object)

数据对象只存储了文件的内容,没有存储文件的名称,若要想知道内容属于哪个文件,则需要创建树对象,并且树对象允许我们将多个文件组织到一起。树对象存储的是目录信息(包括:子目录、文件名),是根据某一时刻的暂存区的状态而创建的,所以需要先将test.txt填加到暂存区,采用git update-index命令添加暂存区,因为该文件不在暂存区,所以必指定–add选项,又因该文件的内容位于Git数据库中,所以必须指定–cacheinfo选项,同时需要指定文件模式、SHA-1和文件名,100644表示一个普通文件。
在这里插入图片描述
采用git write-tree命令创建树对象,所创建的树对象存储:对象模式、对象类型、SHA-1和文件名
在这里插入图片描述
将test.txt内容改为version-2,并且新增一个文件new.txt,然后再生成一个新的树对象:在这里插入图片描述

3、提交对象(commit object)

上述创建的两个树对象代表了我们想要跟踪的两个项目快照。但是,若想重用这些快照、想知道这些快照是谁创建的、什么时候创建的就需要创建提交对象。可以用命令git commit-tree命令来创建一个提交对象,需要指定一个树对象的SHA-1值,以及其父提交对象(如果存在的话):
在这里插入图片描述
对最后一次提交执行git log命令,就可以看到相应的提交记录。

4、Git对象存储

<1> 在存储内容时,会有个头部信息一并保存,Git以对象类型作为开头来构造一个头部信息,接着添加一个空格,随后是数据内容的长度,最后是一个空字节(null byte),例:“blob 16\u0000”;
<2> Git会将上述头部信息和原始数据拼起来,并计算出这条新内容的SHA-1校验和(长度为40位的字符串);
<3> 通过zlib压缩这条新内容;
<4> 将压缩的内容写入磁盘上的某个对象,对象的路径:SHA-1值的前两个字符作为子目录名称,后38个字符则作为子目录内文件的名称。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值