GIT commit

文章探讨了Git中快照的存在方式,指出commit时只对修改的文件产生新快照,未修改的文件沿用上一版本。tree对象存储目录结构和文件索引,blob对象存储文件快照。
摘要由CSDN通过智能技术生成

最近在学git操作,特此记录一下
在这里插入图片描述

上图源自GIT官网,由此可以看见,每个新版本中都有全部文件的快照。那么问题就来了,**快照到底以什么方式存在?**以及在全部文件中,有修改和未修改的区分,对于未修改的文件,当前版本该文件的快照是否沿用上一个版本的快照呢?
对于修改的文件是否产生了新的快照呢,新旧快照又怎么查看区分呢?

好,带着上面问题进行本文阅读:

在操作之前需要先介绍一下
在这里插入图片描述
每次commit会产生一个commit对象,以及一个tree对象和多个blob对象[此对象数量取决于文件数量]

tree对象用于记录当前目录结构和文件索引,blob对象则是文件的真实快照。

git add 暂存命令会为每个文件进行校验和计算,这些校验和正是git对文件快照的索引,add命令后,这些校验和会被添加到暂存区,等待commit操作生成tree对象,这些索引被存放在tree对象里面,见上图

所有的对象都可以在.git/objects目录下面进行查找

实践

首先创建一个本地仓库,并添加readme.txt文件,添加’hello world’内容到文件中,如下
在这里插入图片描述见上图,当前.git/obejcts目录下只有info,pack文件夹,在commit操作之后,该目录下会多出几个目录加下图
在这里插入图片描述

通过git log可以发现,本次commit对象的id为64cae5b

在这里插入图片描述
通过git cat-file -p一层层查看,最终确定了readme.txt文件快照,这就回答了第一个问题

添加新的文件demo.txt,并提交,并查看本次提交的tree对象
在这里插入图片描述
第二次提交的tree中对文件readme.txt的索引保持不变,这就回答了第二个问题,即每次提交对未修改的文件会保持其索引不变

修改readme.txt文件内容后,再次查看文件快照索引
在这里插入图片描述
此时readme.txt文件的快照索引发生了改变,所以git是通过索引来进行区分

【结论】每次commit操作会产生一个与之对应的tree对象,其中记录了本次commit,所有文件的索引,即快照,只有本次commit修改的文件才会产生新的快照文件,未修改的文件快照会沿用上次的快照索引,所以每次commit操作不会保存所有文件一次,而是对修改过的文件进行一次保存,至于git为啥可以在本次commit中所有所有文件,功劳归功于tree对象

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卫生纸不够用

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值