GIT保存记录原理之commit对象

news2025/1/4 17:21:25

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,还有很多需要开发者掌握的地方,可以看看我写的其他博文,持续更新中~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/680697.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

57 KVM工具使用指南-制作 LibcarePlus 热补丁

文章目录 57 KVM工具使用指南-制作 LibcarePlus 热补丁57.1 概述57.2 手动制作57.3 通过脚本制作 57 KVM工具使用指南-制作 LibcarePlus 热补丁 57.1 概述 LibcarePlus 支持如下方式制作热补丁: 手动制作通过脚本制作 手动制作热补丁的过程繁琐,对于…

java——反射与注解

文章目录 Java反射基础1. 概念详解2. 示例代码 Java反射进阶1. 框架设计2. 动态代理3. 模板方法 Java注解基础1. 概念2. 基本语法3. 自定义注解4. 反射获取注解信息 Java注解进阶1. 应用场景2. 内置注解3. 第三方注解库4. 总结 Java反射与注解实战1. 实战场景2. 代码实现 Java反…

AutoSAR系列讲解(入门篇)2.3-Ports的类型

Ports的类型 一、接口的类型 二、S/R接口 三、C/S接口 一、接口的类型 Ports是SWC和SWC做接口(Interface)通信使用,或者SWC通过RTE和BSW做接口(Interface)通信使用。 Ports主要分为5种类型,列在下面的图…

【UEFI实战】UEFI图形显示(显示驱动)

显示驱动 OVMF BIOS使用了这个作为显卡驱动,具体图形显示的底层实现不是重点,所以这里只是简单介绍。 QemuVideoDxe是一个UEFI Driver Model,对应的EFI_DRIVER_BINDING_PROTOCOL: EFI_DRIVER_BINDING_PROTOCOL gQemuVideoDriv…

【数据库】事务、事务并发问题、并发事务隔离级别、及sql演示

文章目录 一、事务1.1 事务简介 及 sql 操作1.2 事务的特性 二、事务并发问题三、事务隔离级别四、sql 演示4.1 脏读4.2 不可重复读4.3 幻读 五、演示代码 一、事务 1.1 事务简介 及 sql 操作 事务:数据库执行的一系列操作,这些操作要么全部执行&#x…

【Java技术专题】「入门到精通系列教程」深入探索Java特性中并发编程体系的原理和实战开发指南(内存模型技术专题)

深入探索Java特性中并发编程体系的原理和实战开发指南( 线程进阶技术专题) 前言介绍JVM内存模型运行时数据区域堆内存栈内存 内存访问规则原子性对象类型基本类型 可见性有序性(Happen Before法则)系统内存(MESI协议&a…

【OS】【期末选择题】【2023春】【仅供参考】

文章目录 题型一、选择第一章(10)第二章(19)第三章(23)第四章(32)第五章(15)第六章(15) 二、填空题三、简答题1.信号量2.调度算法3.页面置换4.虚拟地址到物理地址的映射 Reference 题型 题型题量分值选择10%填空25%10%10%解答题210’大题215’ 一、选择 第一章(10) 操作系统…

HuggingFace-RL-Unit2-Part1——Q-learning算法介绍

Q-learning算法介绍 文章目录 Q-learning算法介绍回顾: 什么是RL? 两种基于价值的方法状态价值函数动作价值函数 贝尔曼方程:简化价值计算蒙特卡罗 VS 时序差分学习蒙特卡洛:在一个回合结束后进行学习时序差分算法:在每一步进行学习 学习进展…

定时器的实现原理

文章目录 1.定时器的作用?2.数据结构要求3.时间轮4.分级时间轮5.业界实现方案参考文献 1.定时器的作用? 定时器的主要用途是执行定时任务。 定时任务在很多场景都需要用到,比如游戏的 Buff 实现,Redis 中的过期任务,Linux 中的定时任务&a…

java——多线程

文章目录 Java 的并发基础知识1. 创建线程2. 同步方法和同步代码块3. 线程安全的容器4. volatile 关键字5. Lock 和 Condition 接口 Java 多线程编程的基本框架1. 创建和启动线程2. 线程的状态转换3. 线程安全4. 死锁 Java 并发编程的高级技术1. 线程池2. 并发集合3. 原子类4. …

测试:进阶篇

在本篇章开始之前,先对之前的内容进行一个简单的总结回顾一下: 基于需求设计测试用例,这里有个测试用例的万能公式: 功能(如果是软件,需要参考依据需求规格说明书;如果是物体,这个…

2023年7月电脑选择

文章目录 一、笔记本1.1 确定需求1.2 确定预算1.3 性能指标1.4 其他 二、台式电脑 最近有朋友让我推荐一下能做3D建模的笔记本电脑,本文就讲一下台式机和笔记本怎么选择。 一、笔记本 1.1 确定需求 当我们在选择笔记本时,首先需要确定自己的需求&#x…

CSS基础学习--24 表单

一、一个表单案例&#xff0c;我们使用 CSS 来渲染 HTML 的表单元素 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>CSS基础学习-表单</title> </head> <style> input[typetext], select {width:…

计算机基础--->数据结构(3)【堆(超详细)】

文章目录 堆堆的时间复杂度堆的分类堆的存储堆的操作插入元素删除堆顶元素 堆排序建堆排序 所有操作代码 堆 堆一般分为两种类型&#xff1a;最大堆和最小堆。在最大堆中&#xff0c;父节点的值总是大于或等于子节点的值&#xff0c;而在最小堆中&#xff0c;父节点的值总是小于…

计算机自我介绍500字范文(合集)

计算机自我介绍500字范文1 本人是___大学计算机系统维护专业的学生。大学四年的学习&#xff0c;积累了丰富的专业知识&#xff0c;广泛的人际关系&#xff0c;培养我成为一个敢于承担责任&#xff0c;对待生活乐观积极&#xff0c;吃苦耐劳的青年。在专业方面我的主攻方向是计…

Ffmpeg6.0版本源码解读第一期!

前言&#xff1a; 大家好&#xff0c;最近一直在直播讲解Ffmpeg6.0版本的源码解析&#xff0c;这里要明白学习源码能给我们带来什么好处&#xff1f;我相信很多小伙伴已经用过Ffmpeg去开发&#xff0c;不知道大家有没有在开发的过程&#xff0c;调用接口的时候&#xff0c;是否…

PowerDesigner面向对象建模-常用UML图

1 PowerDesigner简介 PowerDesigner最初由Xiao-Yun Wang&#xff08;王晓昀&#xff09;在SDP Technologies公司开发完成。PowerDesigner是Sybase的企业建模和设计解决方案&#xff0c;采用模型驱动方法&#xff0c;将业务与IT结合起来&#xff0c;可帮助部署有效的企业体系架…

python熟悉python基础语法,了解html网络结构,了解json格式数据,含有字符串

前言 Python网络爬虫是利用Python编写的程序&#xff0c;通过自动化地访问网页、解析html或json数据&#xff0c;并提取所需信息的技术。下面将详细介绍一些与Python网络爬虫相关的重要知识点。 1、Python基础语法&#xff1a; 变量和数据类型&#xff1a;学习如何声明变量以及…

使用R语言绘制富集条形图,轻松分析基因表达数据

一、引言 富集分析&#xff08;enrichment analysis&#xff09;是一种生物信息学方法&#xff0c;它可以帮助我们识别基因或其他的生物实体在某个特定的类别中过度表示的趋势。通俗来说&#xff0c;富集分析通过将基因分类到特定的集合中&#xff0c;然后根据基因在集合中的分…