关于git:GIT保存记录原理之commit对象

48次阅读

共计 2335 个字符,预计需要花费 6 分钟才能阅读完成。

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,还有很多须要开发者把握的中央,能够看看我写的其余博文,继续更新中~

正文完
 0