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. 批x网,登录加密(通过元素绑定的监听事件来找到加密函数)

    网站 base64加密 aHR0cHM6Ly93d3cucGlnYWkub3JnLw== 逆向分析 https://blog.csdn.net/a_123_4/article/details/1208 ...

  2. 2022-10-09:我们给出了一个(轴对齐的)二维矩形列表 rectangles 。 对于 rectangle[i] = [x1, y1, x2, y2],其中(x1,y1)是矩形 i 左下角的坐

    2022-10-09:我们给出了一个(轴对齐的)二维矩形列表 rectangles . 对于 rectangle[i] = [x1, y1, x2, y2],其中(x1,y1)是矩形 i 左下角的坐标 ...

  3. 2022-02-15:扫地机器人。 房间(用格栅表示)中有一个扫地机器人。 格栅中的每一个格子有空和障碍物两种可能。 扫地机器人提供4个API,可以向前进,向左转或者向右转。每次转弯90度。 当扫地机

    2022-02-15:扫地机器人. 房间(用格栅表示)中有一个扫地机器人. 格栅中的每一个格子有空和障碍物两种可能. 扫地机器人提供4个API,可以向前进,向左转或者向右转.每次转弯90度. 当扫地机 ...

  4. Golang接收者方法语法糖

    1.概述 在<Golang常用语法糖>这篇博文中我们讲解Golang中常用的12种语法糖,在本文我们主要讲解下接收者方法语法糖. 在介绍Golang接收者方法语法糖前,先简单说下Go 语言 ...

  5. C++实现查询本机信息并且上报

    业务需求 共享文件夹.盘会导致系统安全性下降,故IT部门需要搜集公司中每台电脑的共享情况,并且进行上报 关键字 WMI查询.Get请求.C++网络库mongoose 前置需要 1.简单C++语法知识2 ...

  6. 手机app抓包个人简述

    1.将在网上下载的手机软件放入apps 2.启动 3.查看结果 urls里是网址

  7. k8s calico网络

  8. Java动态数组及数组排序的三种常用方法

    一.动态数组 1.数组的定义: ​ 用于存储相同数据类型的一组连续的存储空间 2.数组的特点: ​ 数组的长度一旦定义,则不可改变 ​ 访问数组的元素需要通过下标(索引)访问,下标从0开始 ​ 数组是 ...

  9. Java(数组使用、Arrays、稀疏数组)

    1.数组的使用 For-Each循环 int[] arrays = {1,2,3,4,5}; //打印全部的数组元素 JDK1.5 没有下标 for (int array : arrays) { Sy ...

  10. LeetCode 周赛 348(2023/06/05)数位 DP 模板学会了吗

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 加入知识星球提问! 往期回顾:LeetCode 单周赛第 347 场 · 二维空间上的 LIS 最长递增子序列问题 ...