git原理之commit对象

什么是Git?

Git是一个分布式的版本控制系统,Git通过版本库来管理数据(代码),严格来说 他是一个对象数据库。
Git中提交对象非常重要,我们通过它记录代码提交过程,进行文件保存、回退等操作,那么他是怎样帮助我们记录这些信息的呢?其实就是都保存在项目根目录的.git文件夹中
新建空项目gitDemo使用git init初始化,在文件夹根目录下会生成.git文件夹,在文件夹中会生成以下内容
|——.git/
| |——hooks/
| |——info/
| |——objects/
| |——info/
| |——pack/
| |——refs/
| |——config/
| |——description/
| |——HEAD/
此时在项目下新建index.js文件,增加一行代码;并执行git add 操作,为方便观察,目录结构只保留.git文件夹下的objects中的内容

const num =1;
企业微信截图_c8e6ec12-7de3-4b49-88d1-d6db3be67c28.png

可以看到在这次添加到暂存区的操作后,objects文件中增加了一个23文件夹,并多出了一个以8bdc开头的哈希值,使用git cat-file -t查看文件类型,git cat-file p查看文件具体保存的内容
企业微信截图_a016fbbe-77bd-4e9b-8265-d68837292d90.png

8bdc开头的哈希值文件是以二进制的形式保存着git add 提交的文件内容
再执行git commit 操作生成了一个哈希值为13d5976的校验和
在objects文件中生成了13 81两个文件夹


企业微信截图_7f5360fe-94be-4724-a1c6-d52f7eaaaede.png

再次使用 git cat-file 查看两个新增的文件夹内容
企业微信截图_be73eaf6-9ac5-4402-bf9a-646ca0f1d986.png

81文件夹da9a文件记录着哈希值+文件的一组值,指向的就是 git add 的记录及对应的文件。

13文件夹d597文件以树结构的形式记录着 git commit 的操作记录,包含提交者姓名邮件等信息,其中提交后展示的校验和 13d5976 也就是指向这个文件。


捕获.PNG

以上只有一次提交 如果提交多次文件如何进行关联呢?
继续在index.js文件中添加以下代码:

function add (a,b){
  return a+b;
}
企业微信截图_d8af1d8c-8d80-407d-af39-18d11466dc01.png

79acae文件保存的是整个index.js的内容


企业微信截图_6518c681-61be-48a1-ba9b-92cbdd819a4e.png

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

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


企业微信截图_ab3ddf78-7343-4bc0-b370-871d1f3c7a70.png

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容