Git对象

在Git中有四种对象分别是commit对象,tree对象,blob(binary large object), tag(这里先不讲tag)对象。每一种Git对象都有SHA-1 校验和来索引!

blob:这种对象存储的是文件的内容。
tree:通常 Git 根据你的暂存区域或 index 来创建并写入一个 tree对象,tree对象类似于目录,目录里面存储着指向blob对象的SHA-1校验和,也可以存储指向另一个tree的SHA-1校验和。
commit : 指向根据你的暂存区域来创建的tree对象。

这里写图片描述
接来实际操作一下!
在工作区创建一个目录demo和一个文本文件demoText

tips:如果目录下面没有子目录则不会创建对应的tree对象!

这里写图片描述
在demo目录下创建一个demo文本文件

这里写图片描述
向demoText和demo文件里写入信息

这里写图片描述
添加到暂存区并且提交到版本库
(这里出现warning的原因是windows中的换行符为 CRLF, 而在linux下的换行符为:LF,生成一个工程,文件中的换行符为LF,当执行git add .时,系统就提示LF 将被转换成 CRLF)

这里写图片描述

commit对象的SHA-1校验和的值如下:
2a4f3aa2e531b51c32653c1304d35a98261cf392

commit对象指向根据你的暂存区域或 index 来创建并写入一个 tree对象,而这个对象的SHA-1校验和的值如下:
3233d5c8dde3ec507ea21b6799c116e69d8d7c56

然后使用 git cat-file -t 查看commit对象的SHA-1 校验和指向的对象为commit类型对象,在使用 git cat-file -p 查看SHA-1 校验和指向的对象的具体内容。

这里写图片描述

tips:使用git cat-file -p 显示的内容含义如下
第一列表示文件模式,比如100644表示是一个普通文件,100755表示是一个可执行文件。
第二列表示文件是哪一种对象。
第三列表示SHA-1校验和
第四列表示文件名

在查看根据暂存区生成的tree对象里面的内容如下:
d40f164f53d0e4fc25067bb1a58f37a3488df95b 指向的是demo目录并且是个tree对象表示下面还有blob对象。

e35c8b7b28a2dfa5078ac25a56a7e0059390c03f 指向的是demoText这文件对象类型是blob并且文件内容是demoText

这里写图片描述

查看d40f164f53d0e4fc25067bb1a58f37a3488df95b 指向的对象,这个对象包含了一个指向一个blob的SHA-1校验和,1549b67ca5936e6893c89221d508697e7e97d42b
文件名为demo,内容为demo

下面的思维图可以更好的理解Git对象之间的关系
这里写图片描述

Git为了节省空间如果这一次提交没有被修改的文件不会创建新的blob,而是会指向原来的blob。

修改demoText,然后查看工状态。
这里写图片描述

添加到暂存区然后提交
这里写图片描述

查看日志
这里写图片描述

查看此次提交时会发现一个parent属性,这个parent属性是本次commit对象的父对象(也就是上一次提交的commit)

这里写图片描述

查看此次commit对象所对应的tree对象里的内容,没有被修改的文件和目录是不会重新创建新的对象!
这里写图片描述

最后的思维图如下
这里写图片描述

参考

《Pro Git》


如此文章有不对地方请多多指正!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值