Git工作原理

一.Git是如何识别对象的

所有的对象都以SHA值为索引用gzip格式压缩存储, 每个对象都包含了对象类型, 大小和内容.

你可以在Git里的 \.git\objects\目录下这种用gzip格式压缩存储的“40个字符”字符串文件的对象。

git是通过一个40个字符的(40-digit)“对象名”来索引的,对象名看起来像这样:

2683010724f10b0ee0994e19b67713e7800be7

每一个“对象名”都是对“对象”内容做SHA1哈希计算得来的,(SHA1是一种哈希算法)。这样就意味着两个不同内容的对象不可能有相同的“对象名”。

这样做会有几个好处:

1.Git只要比较对象名,就可以很快的判断两个对象是否相同。

因为每个仓库(repository)计算“对象名”的算法完全一样,所以“对象名”不同,必定对象内容不同,如果同样的内容存在两个不同的仓库中,就会存在相同的“对象名”下。

2.Git还可以通过检查对象内容的SHA1的哈希值和“对象名”是否相同,来判断对象内容是否正确。

二、git中的两种对象

Git中存在两种对象 - 松散对象(loose object)打包对象(packed object).

1、 松散对象(loose object):它就是磁盘上的一个存储压缩数据的文件. 每一个对象都被写入一个单独文件中.

你可以在.git\objects\2a目录下找到松散对象2683010724f10b0ee0994e19b67713e7800be7(SHA为2a2683010724f10b0ee0994e19b67713e7800be7)

Git使用SHA值的前两个字符作为子目录名字, 所以一个目录中永远不会包含过多的对象. 文件名则是余下的38个字符

SHA值是文件内容的一个引用(译者注: 相当于指针指向对应的块对象).

我们可以使用cat-file命令去查询特定对象的信息. 注意下面只键入了SHA值的一部分, 不必把40个字符全部键入:

我们可以看到上图中的对象类型为tree,一个树(tree)对象可以引用一个或多个块(blob)对象, 每个块对象都对应一个文件. 更进一步, 树对象亦可以引用其他的树对象, 从而构成一个目录层次结构.  每一个提交都对应一个树对象。你可以使用ls-tree去查看树的内容:

我们可以看到2a683010 tree对象下有如下内容

一个"块"(blob)即是文件的数据, 我们可以用cat-file查看其内容:

注意文件内容可能是旧的

所有的对象都使用SHA1值作为索引存储在git目录之下,这些文件的内容其实是压缩的数据外加一个标注类型和长度的头. 类型可以是块(blob), 树(tree), 提交(commit)或者标签(tag).

我们可以用.git/HEAD找到HEAD提交

把HEAD转换到dev分支

然后.git/HEAD

上面的输出告诉了我们现在在哪个分支之上工作.

Git通过创建.git目录下的文件去标识分支(译注: 即refs/heads下面的文件, 多个分支会有多个文件). 每个文件中包含了一个提交的SHA1值, 我们可以用cat-file去查看此提交的内容(译注: 此提交即为该分支的头):

我们看一下\.git\refs\heads目录,可以看到有两个HEAD提交文件dev 和 head

我们一起来看一下master提交文件里面有什么

parent(父对象)指向了前一个提交:。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值