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. 2021-01-17:java中,HashMap底层数据结构是什么?

    福哥答案2020-01-07: 1.7 数组+链表重要字段://HashMap的主干数组,可以看到就是一个Entry数组,初始值为空数组{},主干数组的长度一定是2的次幂,至于为什么这么做,后面会有详 ...

  2. 2022-04-21:给定一个包含 [0,n) 中不重复整数的黑名单 blacklist, 写一个函数从 [0, n) 中返回一个不在 blacklist 中的随机整数, 对它进行优化使其尽量少调用系

    2022-04-21:给定一个包含 [0,n) 中不重复整数的黑名单 blacklist, 写一个函数从 [0, n) 中返回一个不在 blacklist 中的随机整数, 对它进行优化使其尽量少调用系 ...

  3. 2021-12-09:二叉树展开为链表。 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左

    2021-12-09:二叉树展开为链表. 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左 ...

  4. 【GiraKoo】Android Studio调试时,提示port无法打开

    Android Studio调试时,提示port无法打开 现象描述 在Android Studio在进行调试时,无法正常运行.App闪退. IDE提示: Error running 'app': Un ...

  5. Python分割多空格字符方法

    问题: 现有一个字符串 "1 + 5" ,想要获取 1,+,5 这三个元素 做法: str.split(' ') ['1', '', '', '', '', '', '+', '' ...

  6. IntelliJ IDEA上手这一篇就够了,从入门到上瘾

    前言 每次换电脑,最最最头疼的事情莫过于安装各种软件和搭建开发环境.这算是不想换电脑的一个原因吧(最主要还是穷).除非是电脑坏了开不了机或者点一下卡一下,真不想换电脑.每次换电脑都得折腾好久. 趁着这 ...

  7. 使用ptrace将标准输出重定位到文件

    首先使用PTRACE_SYSCALL获取到系统调用号,如果是write则将文件描述符从标准输出变为我们打开的文件 #include <stdio.h> #include <fcntl ...

  8. 图解Redis和Zookeeper分布式锁

    1.基于Redis实现分布式锁 Redis分布式锁原理如上图所示,当有多个Set命令发送到Redis时,Redis会串行处理,最终只有一个Set命令执行成功,从而只有一个线程加锁成功 2:SetNx命 ...

  9. 【python基础】循环语句-while循环

    1.初识while循环 循环语句主要的作用是在多次处理具有相同逻辑的代码时使用.while循环是Python提供的循环语句之一. while循环的语法格式之一: 比如我们输出1-10之间的奇数,编写程 ...

  10. C++面试八股文:C++中,设计一个类要注意哪些东西?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第9面: 面试官:C++中,设计一个类要注意哪些东西? 二师兄:设计一个类主要考虑以下几个方面:1.面向对象的封装.继承及多态.2.big three ...