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```,还有很多需要开发者掌握的地方,可以看看我写的其他博文,持续更新中~
GIT保存记录原理之commit对象的更多相关文章
- 【Git】Git使用记录: 撤回已经commit到本地的提交记录
话不多说直接上步骤: git bash直接干到你的code. 直接敲命令: git reset --soft HEAD~1 搞定 就是这么简单粗暴. 如有顾虑请自行找个案例测试即可. 参考资料 htt ...
- 『现学现忘』Git对象 — 17、Commit对象
目录 1.Commit对象介绍 2.Commit对象说明 3.本地库中对象之间的关系 4.总结 5.练习 6.本文用到的命令总结 1.Commit对象介绍 现在来介绍最后一种Git对象commit对象 ...
- 理解git的分支原理,更好地使用git
文章内容转载于git-scm. 部分内容涉嫌枯燥 一.git分支概念 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作.在很多版本控 ...
- 深入理解Git的实现原理
0.导读 本文适合对git有过接触,但知其然不知其所以然的小伙伴,也适合想要学习git的初学者,通过这篇文章,能让大家对git有豁然开朗的感觉.在写作过程中,我力求通俗易懂,深入浅出,不堆砌概 ...
- Git 基础和原理
Git 究竟是怎样的一个系统呢? 请注意接下来的内容非常重要,若你理解了 Git 的思想和基本工作原理,用起来就会知其所以然,游刃有余. 在开始学习 Git 的时候,请努力分清你对其它版本管理系统的已 ...
- git 学习记录—— git 中的仓库、文件状态、修改和提交操作等
最近开始学习使用版本控制工具 git .学习方式主要通过阅读 git 网站上的 Pro git 和动手实践,使用的系统为 Ubuntu16.04LTS,以及 Windows 8.1. 本文主要关注 ...
- 【git】git的内部原理
参考文章:https://zhuanlan.zhihu.com/p/96631135 参考文章:https://marklodato.github.io/visual-git-guide/index- ...
- git使用记录(新手入门)
最近参与了公司的项目开发,最后要用git来把代码添加到远程库,但是没怎么接触过git,记录一下使用的流程 首先,当然是先下载git,这个略过不提,下载完之后,在你想要保存代码的目录下,用git ini ...
- git传输协议原理
git精神:distributed-is-the-new-centralized 转自:http://git-scm.com/book/zh/v1/Git-%E5%86%85%E9%83%A8%E5% ...
- Git学习记录 力做全网最强入门教程
目录 Git学习记录 力做全网最强入门教程 什么是GitHub? 什么是Git? Git的配置 Git的安装(只介绍windos操作系统下) Git的配置 至此我们的入门教程到此结束,更新中级教程要等 ...
随机推荐
- 虚拟机的安装与linux系统的使用
虚拟机的安装与应用 下载安装VMware Workstation Pro 安装成功之后点击创建虚拟机 勾选典型机型 勾选自动检测安装映像文件 设置虚拟机的命名和安装路径 设置磁盘的大小和虚拟磁盘的储存 ...
- 武装你的WEBAPI-OData与DTO
前面写了很多有关OData使用的文章,很多读者会有疑问,直接将实体对象暴露给最终用户会不会有风险?$expand在默认配置的情况下,数据会不会有泄露风险? 答案是肯定的,由于OData的特性,提供给我 ...
- 2022-11-01:给定一个只由小写字母和数字字符组成的字符串str。 要求子串必须只含有一个小写字母,数字字符数量随意。 求这样的子串最大长度是多少?
2022-11-01:给定一个只由小写字母和数字字符组成的字符串str. 要求子串必须只含有一个小写字母,数字字符数量随意. 求这样的子串最大长度是多少? 答案2022-11-01: 经典的滑动窗口问 ...
- 2022-08-19:以下go语言代码输出什么?A:equal;B:not equal;C:不确定。 package main import ( “fmt“ “reflect“ )
2022-08-19:以下go语言代码输出什么?A:equal:B:not equal:C:不确定. package main import ( "fmt" "refle ...
- 2022-07-31:给出一个有n个点,m条有向边的图, 你可以施展魔法,把有向边,变成无向边, 比如A到B的有向边,权重为7。施展魔法之后,A和B通过该边到达彼此的代价都是7。 求,允许施展一次魔法
2022-07-31:给出一个有n个点,m条有向边的图, 你可以施展魔法,把有向边,变成无向边, 比如A到B的有向边,权重为7.施展魔法之后,A和B通过该边到达彼此的代价都是7. 求,允许施展一次魔法 ...
- 2022-03-12:k8s如何搭建gogs+drone实现自动化部署cicd,yaml如何写?
2022-03-12:k8s如何搭建gogs+drone实现自动化部署cicd,yaml如何写? 答案2022-03-12: 需要安装docker和k3s,见 docker和k3s,k3s不需要依赖d ...
- 2022-02-05:字典序的第K小数字。 给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字。 注意:1 ≤ k ≤ n ≤ 10**9。 示例 : 输入: n: 13 k: 2
2022-02-05:字典序的第K小数字. 给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字. 注意:1 ≤ k ≤ n ≤ 10**9. 示例 : 输入: n: 13 k: 2 输出 ...
- SICP:元循环求值器(Python实现)
求值器完整实现代码我已经上传到了GitHub仓库:TinySCM,感兴趣的童鞋可以前往查看.这里顺便强烈推荐UC Berkeley的同名课程CS 61A. 在这个层次结构的最底层是对象语言.对象语言只 ...
- OODO有关账户account模块学习
一.记账凭证(Account Move) 会计上的记账凭证,也叫会计分录,在Odoo中叫"Account Move".Account Move直译是"账户移动" ...
- 【Python&RS】遥感影像的像素坐标转地理坐标(仿射变换)
GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库.它利用抽象数据模型来表达所支持的各种文件格式 ...