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的配置 至此我们的入门教程到此结束,更新中级教程要等 ...
随机推荐
- 2022-03-26:给定一个无向图, 从任何一个点x出发,比如有一条路径: x -> a -> b -> c -> y, 这条路径上有5个点并且5个点都不一样的话,我们说(x,a,b,c,y)是一条
2022-03-26:给定一个无向图, 从任何一个点x出发,比如有一条路径: x -> a -> b -> c -> y, 这条路径上有5个点并且5个点都不一样的话,我们说(x ...
- annotate()使用聚合计数、求和、平均数 raw()执行原生的SQL
annotate()使用聚合计数.求和.平均数 raw()执行原生的SQL # 按老师分组,求课程的销量 Course.objects.values('Teacher').annotate(vol= ...
- 软硬件--智能穿戴常见BUG及原因分析
软硬件--智能穿戴常见BUG及原因分析 1.手表有常亮功能(类似熄屏表盘),开启常亮暗屏状态下 按侧键,设备时间出现倒退现象:频率切换相关问题: 2.手表有常亮功能(类似熄屏表盘),开启常亮暗屏状态下 ...
- MD5加密后为0e开头的字符串
QNKCDZO 0e830400451993494058024219903391 s878926199a 0e545993274517709034328855841020 s ...
- centOS 7 添加删除用户和用户组
1.添加新用户 由于日常使用时root用户权限过大,所以添加一个用户供日常使用,或者供他人使用. 1 新增用户 adduser [用户名] [root@centos ~]# adduser dex 2 ...
- ✗ CocoaPods not installed.
mac 配置 flutter 会提示许多 关于xcode的 如图 显示 ✗ CocoaPods installed but not initialized. 其实最开始提示的是 ✗ CocoaPods ...
- R 语言中 X11 相关的一些问题
参考 Anaconda 官方文档<Using R language with Anaconda>安装 R-4.0.2: conda create -n r-4.0.2 r-essentia ...
- 【Leetcode】 # 20 有效的括号 Rust Solution About Rust Stack implement
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效.有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合.注意空字符 ...
- 【快应用】addEventListener()方法无法监听动画事件
[关键词] 动画监听.动态改变 [问题背景] Style中设置动画样式,然后在onshow生命周期中调用addEventListener()方法去监听动画事件,无法监听到,该方法无任何回调返回 问题 ...
- 2023-06-16:给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。 我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。 所谓「表现良好的时间
2023-06-16:给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数. 我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」. 所谓「表现良好的时间 ...