服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

这个 git 命令你每天都在用,但你却不知道

日期: 来源:神光的编程秘籍收集编辑:神说要有光zxg

我们每天都在敲 git clone、add、commit、push 这些命令,其实它们涉及到一个底层命令。

这个命令你每天都在用,每天都能看到它的输出,但你却不知道你用到了这个命令。

那这个命令是啥呢?

git 存储内容是通过 object 的形式,文件内容是 blob 的 object,目录是 tree 的 object,commit 就是 commit 的 object。

这三种 object 串联起来就是 git 存储的内容了。

然后 branch 和 tag 都是指向 commit 对象的指针。

也就是这样:

这就是 git 的存储原理。

在 .git 目录下可以看到所有这些 object:

你 git clone 和 push 的时候,其实也就是下载 object:

但修改同一个文件,只是改了一点也会创建一个新的 object,因为 hash 变了。

如果整个大文件就改了一点东西,却把整体都保存为一个新的 object,岂不是太浪费空间了?

没错,git 自然也想到了这点,所以它会做压缩。

怎么压缩的呢?

你可以执行 git gc 这个命令来体验下压缩过程。

比如 text.txt 这个文件,我先 git commit 一次。

然后把最后一行改为 bbb,git commit 一次。再改为 ccc 再 git commit 一次。

这时候有 9 个 object:

因为 3 次内容变动会有 3 个 blob 类型的 object,然后有 3 个 tree object 来指向它们,还有 3 个 commit object。

比如其中一个 tree object 的内容是这样的:

(cat-file -p 就是查看对象内容的命令)

它指向一个 blob 对象。blob 对象内容是这样的:

而这个 tree 对象也有 commit 对象指向它:

这就是 3 种对象的关系。

我们跑下 git gc 看看会发生什么:

输出内容如上,是不是有种莫名的熟悉感?

为什么有熟悉感待会再说,我们先来看看它都做了什么。

你会发现执行完 gc 后 objects 下都没有那些对象了,但是在 pack 目录下多了一个 idx 文件和一个 pack 文件。

这就是压缩打包后的结果。

咋压缩的呢?

看下它的内容就知道了:

执行 git verify-pack -v 看下 idx 文件的内容:

你会看到 3 个 commit、3 个 blob、3 个 tree 对象都列出来了,而且 3 个 blob 对象之间还有指向关系,也就是这个:

叫做 chain。

这是啥呢?

其实 pack 里就是打包后的 object,然后 idx 记录着不同文件在其中的位置。

但是总不能把同样的文件原封不动保存多份吧。

所以 git 会对内容相近的文件做 diff,只保留一个版本的全部内容,其余的都是保存 diff。

那保存哪份呢?

用 cat-file -p 看看它的内容:

发现是保存的最后那个版本的全部内容,之前的版本保存 diff。

原因很容易想到,最新的肯定用的最频繁嘛,这样处理起来也方便。

这就是 git gc 压缩的原理(gc 是 garbage collection,垃圾回收的意思)。

那这个命令和 git clone、git push 有啥关系呢?

你再瞅瞅它的输出看看:

是不是很熟悉?

对比下 git push 的输出:

是不是一毛一样!

没错,在 git push 之前,git 会执行 git gc 来压缩打包再传输。

再来看看 git clone 的输出:

同样能看到 git gc 的身影。

没错,在 git clone 的时候,服务端也会执行 git gc 再传输。

所以 git gc 这个命令你每天都在用,每天都能看到它的输出,但你却不知道它的存在。

总结

git 通过 blob 存储文件内容,tree 存储目录信息,commit 存储提交信息,这 3 种对象关联起来就是 git 的存储原理。

但是同样的内容保存多个类似的 object 是没必要的,git 自然也做了处理,就是 git gc 命令,它会把所有 object 打包到一起,并且类似的内容只会保留最新的那个,其余的只保存 diff。

其实你每天都能看到 git gc 的身影,尤其是你执行 git clone、git push 命令的时候。

下次再 clone、push,你能想起这个 git gc 了么?


相关阅读

  • 可视化搭建 - 组件值校验

  • 组件值校验,即在组件值变化时判断是否满足校验逻辑,若不满足校验逻辑,可以拿到校验错误信息进行错误提示或其他逻辑处理。声明 valueValidator 可开启值校验:import { Component
  • 令人惊艳又好用的中国好词语

  • 来源:一周文案(ID:copyweekly)‍‍有极强功底的文字是怎么样的?达而简。即:词能达意且简短。中国人素来有这种智慧。很多传承下来的好词语就体现了这一点,不需要华丽辞藻,也不用刻
  • 每日速递 | 宁德时代牵手一汽解放布局电池回收

  • 会议倒计时10天2023复合集流体产业峰会——跨越从0到1 开启变革时代 主办单位:高工锂电、高工产业研究院(GGII) 总冠名:诺德股份 峰会地点:深圳机场凯悦酒店 峰会时间:2023年3
  • 高学历选择家政,是大材小用吗?

  • 文|王远方近日,全国人大代表姚劲波在接受采访时提到,近年来,有本科毕业生主动从事家政服务行业。他们如果去一般公司,工资可能拿5000块钱,是比较基层的白领,但如果从事家政,工资1万
  • 影讯|3月14日放映

  • 观影提示观影期间请您全程佩戴好口罩,感谢大家的配合,祝大家观影愉快!网络售票平台:淘票票、中国电影资料馆APP《爱情神话》B for Busy 20213月14日 19:00 | 小西天艺术影院1号
  • Sisley法国希思黎2023届春季招聘开启!

  • 500强校园招聘60万优质大学生求职优选平台来源 | 希思黎SISLEY招聘▼阅读原文 进入网申地址23春招已然火爆开启!5姐为23届的大家创建了23届春招备战群
  • 微信零钱提现时,千万别这么做!

  • 把钱存在零钱通内需要用的时候却提不出来一般人会第一时间联系客服可陈女士怎么也想不到自己在网上搜“微信客服”竟会导致她被骗13000元真实案例3月7日晚浙江省温州市乐清

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • 这个 git 命令你每天都在用,但你却不知道

  • 我们每天都在敲 git clone、add、commit、push 这些命令,其实它们涉及到一个底层命令。这个命令你每天都在用,每天都能看到它的输出,但你却不知道你用到了这个命令。那这个命令
  • 山东省政府人事任免通知(62号—75号)

  • 山东省人民政府关于任免徐民等工作人员职务的通知鲁政任〔2023〕62号省卫生健康委:山东省人民政府决定,任命:徐民为山东省卫生健康委员会副主任(试用期一年);盖英群为山东省卫生健