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对象的更多相关文章

  1. 【Git】Git使用记录: 撤回已经commit到本地的提交记录

    话不多说直接上步骤: git bash直接干到你的code. 直接敲命令: git reset --soft HEAD~1 搞定 就是这么简单粗暴. 如有顾虑请自行找个案例测试即可. 参考资料 htt ...

  2. 『现学现忘』Git对象 — 17、Commit对象

    目录 1.Commit对象介绍 2.Commit对象说明 3.本地库中对象之间的关系 4.总结 5.练习 6.本文用到的命令总结 1.Commit对象介绍 现在来介绍最后一种Git对象commit对象 ...

  3. 理解git的分支原理,更好地使用git

    文章内容转载于git-scm. 部分内容涉嫌枯燥 一.git分支概念 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作.在很多版本控 ...

  4. 深入理解Git的实现原理

      0.导读   本文适合对git有过接触,但知其然不知其所以然的小伙伴,也适合想要学习git的初学者,通过这篇文章,能让大家对git有豁然开朗的感觉.在写作过程中,我力求通俗易懂,深入浅出,不堆砌概 ...

  5. Git 基础和原理

    Git 究竟是怎样的一个系统呢? 请注意接下来的内容非常重要,若你理解了 Git 的思想和基本工作原理,用起来就会知其所以然,游刃有余. 在开始学习 Git 的时候,请努力分清你对其它版本管理系统的已 ...

  6. git 学习记录—— git 中的仓库、文件状态、修改和提交操作等

    最近开始学习使用版本控制工具  git .学习方式主要通过阅读 git 网站上的 Pro git 和动手实践,使用的系统为 Ubuntu16.04LTS,以及 Windows 8.1. 本文主要关注 ...

  7. 【git】git的内部原理

    参考文章:https://zhuanlan.zhihu.com/p/96631135 参考文章:https://marklodato.github.io/visual-git-guide/index- ...

  8. git使用记录(新手入门)

    最近参与了公司的项目开发,最后要用git来把代码添加到远程库,但是没怎么接触过git,记录一下使用的流程 首先,当然是先下载git,这个略过不提,下载完之后,在你想要保存代码的目录下,用git ini ...

  9. git传输协议原理

    git精神:distributed-is-the-new-centralized 转自:http://git-scm.com/book/zh/v1/Git-%E5%86%85%E9%83%A8%E5% ...

  10. Git学习记录 力做全网最强入门教程

    目录 Git学习记录 力做全网最强入门教程 什么是GitHub? 什么是Git? Git的配置 Git的安装(只介绍windos操作系统下) Git的配置 至此我们的入门教程到此结束,更新中级教程要等 ...

随机推荐

  1. vue页面中展示markdown以及katex公式

    场景 数据库中有markdown语法的字符串,需要展示为正常的页面,难点在于其中的katex数学公式 解决方式 使用showdown及其族系插件 npm i showdown npm i showdo ...

  2. 【python爬虫】bilibili综合热门页面视频图片爬取

    此博客仅作为交流学习 我用python来爬取bilibili综合热门页面视频图片 首先分析页面: 如上图所示,当我们想要在页面爬取图片时,往往得不到页面图片的地址,这时我们也得不到图片 开始抓包分析: ...

  3. 2021-02-15:给定一个整型数组arr,代表数值不同的纸牌排成一条线。玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿。但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都绝顶聪明。请返回最后获胜者的分数。

    2021-02-15:给定一个整型数组arr,代表数值不同的纸牌排成一条线.玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿.但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都绝顶聪 ...

  4. Selenium - 元素定位(2) - XPATH进阶

    Selenium - 元素定位 XPATH 定位进阶 元素示例 属性定位 # xpath 通过id属性定位 driver.find_element_by_xpath("//*[@id='kw ...

  5. MD5加密后为0e开头的字符串

    QNKCDZO         0e830400451993494058024219903391 s878926199a      0e545993274517709034328855841020 s ...

  6. linux 系统安全和应用

    目录 一.系统安全 二.账号安全 三.修改密码生效时间 四.强制下次登录成功时修改密码 五.历史命令 六.终端自动注销 七.wheel组 八.grub菜单密码 一.系统安全 原因:1.系统数据想要保护 ...

  7. MySQL之常用函数介绍

    一:函数的简介 函数可以把我们经常使用的代码封装起来,需要的时候直接调用即可.这样既提高了代码效率,又提高了可维护性.在SQL中我们也可以使用函数对检索出来的数据进行函数操作.使用这些函数,可以极大地 ...

  8. 现代 C++ 性能飞跃之:移动语义

    *以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/Xd_FwT8E8Yx9Vnb64h6C8w 带给现代 C++ 性能 ...

  9. WPF 入门笔记 - 04 - 数据绑定

    慢慢来,谁还没有一个努力的过程. --网易云音乐 概述 数据绑定概述 (WPF .NET) 什么是数据绑定? 数据绑定(Data Binding)是WPF一种强大的机制,用于在应用程序的各个部分之间建 ...

  10. 楠少音乐盒(PC端)突破校园网限制

    楠少音乐盒 突破校园网限制 最近在将音乐盒从web迁移到PC端,过程中的记录 在我们学校,工作时间内(周一至周五为工作日,下午上班时间)校园网都会拦截一些与工作无关的网站,例如购物.炒股.游戏.音乐等 ...