GIT保存记录原理之commit对象

这篇具有很好参考价值的文章主要介绍了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是哈希值开头。

GIT保存记录原理之commit对象

6228 开头哈希值的文件是以二进制的形式保存着提交的 index.js 中的内容。再执行 git commit操作,生成了哈希值为 93917b9 的校验和。

GIT保存记录原理之commit对象

在查看.git文件夹,其中增加了名为22、93的文件夹。

├───📁 objects/
│ ├───📁 03/
│ │ └───📄 62286e257cbf1422d31c588d8d912cabc5de09
│ ├───📁 22/
│ │ └───📄 9c6b53764537cdacbb4d7968600d25e1aa329a
│ ├───📁 93/
│ │ └───📄 917b98e6e57d216d1033799d406fabacff860c
│ ├───📁 info/
│ └───📁 pack/

再次使用 git cat-file查看新增的两个二进制文件内容。

GIT保存记录原理之commit对象

22文件夹9c6b文件记录着哈希值+文件的一组值,指向的就是 git add的记录及对应的文件。
93文件夹917b文件以树结构的形式记录着 git commit的操作记录,包含提交者姓名邮件等信息,其中提交后展示的校验和 93917b9 也就是指向这个文件。

GIT保存记录原理之commit对象

以上只有一次提交,如果多次提交如何进行关联呢?

继续在 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对象

再执行 git commit 将提交对象与其关联,又新增了两个文件夹 45 、8b。

├───📁 objects/
│ ├───📁 03/
│ │ └───📄 62286e257cbf1422d31c588d8d912cabc5de09
│ ├───📁 22/
│ │ └───📄 9c6b53764537cdacbb4d7968600d25e1aa329a
│ ├───📁 45/
│ │ └───📄 b36b6ac0634c8dbffb02147c1eb88de104ef55
│ ├───📁 8b/
│ │ └───📄 1ab6730f387db1b607883c127bbc36fb1a63d6
│ ├───📁 93/
│ │ └───📄 917b98e6e57d216d1033799d406fabacff860c
│ ├───📁 9f/
│ │ └───📄 63bb8fdc655c54cf3e6f0f84d34bc08a420667
│ ├───📁 info/
│ └───📁 pack/

查看两个文件的内容,与第一次提交大体一致,但是在保存提交对象的 8b1ab6 文件中新增了一个 parent 属性,指向的是上一次提交对象 93917b。

GIT保存记录原理之commit对象

通过 parent 属性,将本次和上次提交关联到了一起,这样可以根据最后一次提交向上查找,找到所有的提交记录。

GIT保存记录原理之commit对象

上述提交到缓存区的文件都只有一个,所以在提交对象中保存的记录也只有一条,如果修改的文件存在多个,就会创建多个文件夹来保存修改的文件。

GIT保存记录原理之commit对象

每一次 commit 提交都是一个 commit 对象,通过40位的哈希校验和,可以找到 tree 对象,它也是一个校验和,通过这个校验和可以找到这次提交依赖的所有文件(二进制)并还原成真实文件。

以上就是 GIT commit 对象相关内容,关于 GIT、JavaScript、nodejs,还有很多需要开发者掌握的地方,可以看看我写的其他博文,持续更新中~文章来源地址https://www.toymoban.com/news/detail-499058.html

到了这里,关于GIT保存记录原理之commit对象的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • git rebase合并多个commit记录

    在做一个需求的时候,会出现多次提交记录,如下: 其中,发现中间有三次提交的记录一致,是可以合并成一次commit的 下面开始合并: 1.找到要合并的commit 命令 其中 -i 的意思是–interact,即弹出交互式的界面让用户编辑完成合并操作 [startpoint] [endpoint]是前开后闭的区间 [

    2024年02月07日
    浏览(32)
  • git删除已push的commit记录

    问题: 1, commit注释写错 2, 发版时,只允许有一条commit记录,但代码还push到远程了 3, 没拉最新代码,提交后合并代码时有冲突 操作步骤: 提交历史如图: 代码变更记录如图: git log 查出历史提交记录,找到需要删除的那条记录的上一个的commit-ID: 比如我要删除第二次和第三次

    2024年02月08日
    浏览(72)
  • git——合并分支commit记录 squash提交

         在公司和别人协同合作时,作为开发需要向架构或者负责人提交mr以合并代码,为了提高review效率,有些负责人会要求一个mr仅保留一条commit记录方便代码比对review的观看,但是开发常常是很多需求和bug混合着写,不可能每个分支都暂存一下去其他分支查看吧,因此总会

    2024年02月14日
    浏览(44)
  • 使用Git rebase合并多条提交记录commit。以及使用 git commit amend本地提交直接合并到远程已有commit的用法

    需求场景一 : 对某个小的功能点进行多次反复的修改提交,且已经提交到远程,导致commit记录过多,太过于杂乱无章,想要精简合并一些提交记录。 场景还原: 比如下图4个git commit记录,log1-log4,需要将他们合并成一个提交记录 解决方案: 要处理的是log1-log4 这四条commit记

    2024年02月08日
    浏览(39)
  • 【实战】git 修改之前的提交记录信息(git commit -m ‘...‘)

    不论线上是否已有多次他人提交,只要是修改本地最后一条提交记录信息,都可以按这个来 进入vi编辑器后: 按 i 下方出现’- - 插入 - -‘的提示时,便可编辑提交记录信息 按 ESC ,输入 :wq 保存退出,或 :q! 不保存强制退出 查看提交日志中修改后的信息 查看前面的提交日

    2024年02月15日
    浏览(39)
  • 【笔记】Git|将git仓库中所有的 commit 合成一个,清空所有 git 提交记录

    在对代码进行开源时,我们往往并不希望代码开发过程中的提交记录被其他人看到,因为提交的过程中往往会涵盖一些敏感信息。因此会存在 将仓库中所有 commit 合成一个 的需求。 直觉上,往往会用 rebase 和 squash 或 reset,不过我尝试了一下存在问题,会出现最后仍然剩两个

    2024年02月11日
    浏览(31)
  • 在git使用时不小心commit了大文件,如何删除commit中的大文件记录

    问题背景:由于许多人在使用git命令的时候,习惯于使用 git add . 添加所有更改的命令,这个习惯会导致在进行git 进行push的时候,由于无意间提交commit缓存的大文件,阻止正常的push 从而很难解决,本文为了解决这问题,有以下小经验(文章广泛参考了其他帖子) 如果你也因

    2024年02月16日
    浏览(33)
  • git :合并某个分支上某次commit记录到另外一个分支

    需要将A分支的某次提交记录 ,合并到B分支 1)切回到 A分支 找到提交的commit id 可以使用git log 命令 或者 右键上次提交的记录 copy reversion number         git checkout A git log 2)  切回到 B分支  使用 git cherry-pick  A的 commitID ,回车 3)最后git status /git push 如果遇到问题,可以使

    2024年02月16日
    浏览(44)
  • git将所有patch导出来,并且将其命名为提交的commit记录

    git基本是大部分码农都会用的工具,我们公司以前在维护系统源码的时候,用的repo的管理方式,后来觉得这种方式不太方便,于是,后来都是使用一个大的git仓库进行源码管理。源码仓库跟应用仓库最大的区别在于它非常的庞大,对于我们开发者来说,其实最重要的并非源码

    2024年02月01日
    浏览(36)
  • git与svn之间项目迁移,并保存提交记录

    参考链接 下面附上我个人测试过的可行步骤 一、git迁移至svn 1、打开Git Bash然后进入需要迁移的Git库目录下。 2、 查看svn库日志便会发现所有git版本和提交信息都已经迁移至svn 3、 可能遇到的问题 可能会出现如下提示框,输入t点击ok即可。 如果你不小心写错了init的地址,想

    2024年02月04日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包