GIT保存记录原理之commit对象

GIT 中提交对象非常的重要,我们通过它记录代码提交过程、进行文件保存、回退等操作,那么它是怎样帮助我们记录这些信息的呢?其实就是都保存在项目根目录的 .git 文件夹中。

新建空项目 gitDemo使用 git init初始化,在文件夹根目录下会生成 .git文件夹,文件夹中会生成以下内容,其中 objects中保存着提交相关的数据。
gitDemo
├── 📁.git/
│ ├──📁 hooks/
│ ├──📁 info/
│ ├──📁 objects/
│ ├──📁 info/
│ └──📁 pack/
│ ├──📁 refs/
│ ├──📄 config
│ ├──📄 description
│ └──📄 HEAD

此时在项目下新建 index.js文件,增加一行代码 const num = 1;并执行 git add操作,为方便观察,目录结构只保留 .git文件夹的 objects中的内容。

gitDemo
├── 📁.git/
│ ├──📁 objects/
│ ├──📁 03/
│ │ └──📄 62286e257cbf1422d31c588d8d912cabc5de09
│ ├──📁 info/
│ └──📁 pack/
└───📄 index.js

可以看到在这次添加到缓存区的操作中,objects文件夹中增了 03文件夹,并多出一个以 6228 开头的哈希值。使用 git cat-file -t 查看文件类型,git cat-file -p查看文件具体保存的内容。03是文件夹名,62是哈希值开头。

在这里插入图片描述

6228 开头哈希值的文件是以二进制的形式保存着提交的 index.js 中的内容。再执行 git commit操作,生成了哈希值为 93917b9 的校验和。

在这里插入图片描述

在查看.git文件夹,其中增加了名为22、93的文件夹。

├───📁 objects/
│ ├───📁 03/
│ │ └───📄 62286e257cbf1422d31c588d8d912cabc5de09
│ ├───📁 22/
│ │ └───📄 9c6b53764537cdacbb4d7968600d25e1aa329a
│ ├───📁 93/
│ │ └───📄 917b98e6e57d216d1033799d406fabacff860c
│ ├───📁 info/
│ └───📁 pack/

再次使用 git cat-file查看新增的两个二进制文件内容。

在这里插入图片描述

22文件夹9c6b文件记录着哈希值+文件的一组值,指向的就是 git add的记录及对应的文件。
93文件夹917b文件以树结构的形式记录着 git commit的操作记录,包含提交者姓名邮件等信息,其中提交后展示的校验和 93917b9 也就是指向这个文件。

在这里插入图片描述

以上只有一次提交,如果多次提交如何进行关联呢?

继续在 index.js 中增加一个 add函数,使用 git add 操作。(需要注意的是,如果只执行 git add. ,操作只提交到了暂缓区,仅仅是将它作为二进制文件保存到 objects 中, 是没有 commit 对象和它关联,也无法通过索引值查找,只有执行了 git commit ,才会将提交和 tree 联系到一起。)

此时在原来的基础上增加了9f文件夹。

├───📁 objects/
│ ├───📁 03/
│ │ └───📄 62286e257cbf1422d31c588d8d912cabc5de09
│ ├───📁 22/
│ │ └───📄 9c6b53764537cdacbb4d7968600d25e1aa329a
│ ├───📁 93/
│ │ └───📄 917b98e6e57d216d1033799d406fabacff860c
│ ├───📁 9f/
│ │ └───📄 63bb8fdc655c54cf3e6f0f84d34bc08a420667
│ ├───📁 info/
│ └───📁 pack/

9f63bb 保存的是整个 index.js 文件的内容

在这里插入图片描述

再执行 git commit 将提交对象与其关联,又新增了两个文件夹 45 、8b。

├───📁 objects/
│ ├───📁 03/
│ │ └───📄 62286e257cbf1422d31c588d8d912cabc5de09
│ ├───📁 22/
│ │ └───📄 9c6b53764537cdacbb4d7968600d25e1aa329a
│ ├───📁 45/
│ │ └───📄 b36b6ac0634c8dbffb02147c1eb88de104ef55
│ ├───📁 8b/
│ │ └───📄 1ab6730f387db1b607883c127bbc36fb1a63d6
│ ├───📁 93/
│ │ └───📄 917b98e6e57d216d1033799d406fabacff860c
│ ├───📁 9f/
│ │ └───📄 63bb8fdc655c54cf3e6f0f84d34bc08a420667
│ ├───📁 info/
│ └───📁 pack/

查看两个文件的内容,与第一次提交大体一致,但是在保存提交对象的 8b1ab6 文件中新增了一个 parent 属性,指向的是上一次提交对象 93917b。

在这里插入图片描述

通过 parent 属性,将本次和上次提交关联到了一起,这样可以根据最后一次提交向上查找,找到所有的提交记录。

在这里插入图片描述

上述提交到缓存区的文件都只有一个,所以在提交对象中保存的记录也只有一条,如果修改的文件存在多个,就会创建多个文件夹来保存修改的文件。

在这里插入图片描述

每一次 commit 提交都是一个 commit 对象,通过40位的哈希校验和,可以找到 tree 对象,它也是一个校验和,通过这个校验和可以找到这次提交依赖的所有文件(二进制)并还原成真实文件。

以上就是 GIT commit 对象相关内容,关于 GIT、JavaScript、nodejs,还有很多需要开发者掌握的地方,可以看看我写的其他博文,持续更新中~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值