Git 一张图理解 Git 对象模型

xiaoronglv · 2014年07月28日 · 最后由 linjunhalida 回复于 2014年10月20日 · 11479 次阅读
本帖已被设为精华帖!

Git Object

去年我读 Git Pro 这本书时,很难理解 Git 存储涉及到的四种对象模型 Blob、Tree、Commit、Tag,于是就直接跳过了。

今年用的 Git 逐渐多了起来,且有了一丁点 Linux 基础,回头再看豁然开朗。它的存储方式真是既精妙、又简单。

Blob 对象

新文件纳入到 Git 后会被五马分尸,它的内容被扔到在一个 blob 对象中,它的对象名是基于内容运算生成的一个 40个字符的 SHA1值。

blob 没有文件名,只有内容。

Git Commit

Tree 对象

一个 tree 对象就是一大坨指针,指向:

  1. 其他 small tree(子级 tree)
  2. blob

可以把 Tree 对象想象为 Linux 文件系统中的目录,记录了子目录的信息、文件信息。

Git Commit

Git Commit

Commit 对象

一个 commit 对象由以下几部分组成

  1. 作者
  2. 提交者
  3. 注释
  4. 指向一个 big tree 的指针

Git Commit

还有一个 tag 对象,平时几乎不用,就先不写了。

参考资料

Git Community Book:Git 对象模型

原文链接

http://mednoter.com/git-object.html

共收到 31 条回复

妥妥收藏了

好文。

#2楼 @appell 多谢,已经修改。

好文。

额 用了这么久git 从来没研究过这些对象模型 ~~~

看得出来,楼主很努力!

出游不忘发帖啊! 👏

如所所示,是什么意思?可以解释一下吗?

#8楼 @qichunren 因为每次提交的话,会对更改的文件做一次新的快照,内容没有变化的文件就还是一个指向上一次变化的指针

#8楼 @qichunren

blob文件就像一个个积木,可以被复用

好东西!

@teddy_1004 @xiaoronglv 内容没有变化,但是还是被commit了,是指rename 文件名的这种情况吗?

#12楼 @stardiviner 不是这个意思,git 的哲学之一是每次提交会对所有文件做一次快照,这样即使在无网络的时候也可以回退到任何版本。但是我们每次提交的时候,并不是所有文件都发生变化了,对于没有变化的文件,只需要保留指向上一次变化的指针即可。

#12楼 @stardiviner

其实就是像这样,虚线的部分就是表示相对于上一次提交文件没有发生变化,只需要一个指向上一次的快照即可

@xiaoronglv “新文件纳入到 Git 后会被五马分尸”这个比喻没懂,难道不是整个文件本身就是blob吗?没有被切块吧?

我记得pro git还是哪里说的: git 实际就是一个文件管理系统。补充:第一排是权限位。

Branch对象呢?

#19楼 @vincent

赞,老大的分享更加深入,可以满足刨根问底的同学啦。

@vincent 分析得好深入,真不错,谢谢分享 👏

#19楼 @vincent 清晰易懂,相当nice

#19楼 @vincent 5张图说明了机制,要不再来个diff篇,哈哈

这个地方讲的也挺不错,可以参考下

9.2 Git 内部原理 - Git 对象

真没看懂。。

vincent写的很全面呀,最近正好在看这部份的东西,学到了不少

这个有木有考虑录个视频看看,peter的视频看得很过瘾 。。。

#25楼 @assyer 我觉得这个文档讲得非常清楚,我算是弄懂git的原理了。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册