Git 中的对象模型和文件的详细视图 —— Git 学习笔记 13

Git 中的对象模型和文件的详细视图


本文将用几幅图来可视化一个叫 file1的文件从修改到暂存,再到提交的整个过程。相信会对你理解 Git 有一些帮助。

初始状态

初始状态如下图所示:

在这里插入图片描述

可以看到,工作目录包含file1file2两个文件,分别包含内容 “foo” 和 “bar”.

除了工作目录下的file1file2之外,master 分支上有一个提交(初始提交),用圆形表示。它指向的三角形其实是一棵树(你可以把它想象成目录),树指向了和file1file2内容完全一样的 “foo” 和 “bar”.

索引中的那个三角形,和对象库的那棵树是完全一样的,它们都指向相同的对象(“foo” 和 “bar”)。

这幅图还告诉我们,分支就是一个指针,指向某个提交。

目前来看,工作区、索引、对象库是完全一致的,没有什么是脏的。

编辑一个文件之后

在这里插入图片描述

如图所示,当把文件file1的内容从 “foo” 改成 “quux” 之后,索引和对象库并没有变化,但是工作目录脏了,因为它和索引不一致了。

暂存文件后

在这里插入图片描述

当执行命令git add file1后,一些有趣的变化发生了。

Git 首先取出工作目录中file1的最新版本(“quux”),为它的内容计算出一个 SHA1 散列 ID(bd71363),然后把这个 ID 保存在对象库中(当然,文件内容也会保存在对象库中)。接下来,Git 会改变索引,让索引指向新的file1。由于文件file2没有变化,所以索引依然指向原来的file2

此时,工作目录与索引是一致的。但是,索引和对象库不一致。

提交之后

在这里插入图片描述

啊呀,提交之后好像图示有点乱啊。别着急,我来解释一下。

首先,索引对象转化成了一个真实的树对象(深色的三角形),这个对象会以 SHA1 命名(图上没有标出来而已),被放到对象库中。

其次,用你的日志消息创建了一个新的提交对象(深色的圆形)。新的提交对象会指向新创建的树对象,并且指向前一个提交。

最后,master 分支的引用从最近一次提交移动到新创建的提交。

此时,工作目录、索引和对象库再次同步,又变得一致了。


参考资料

《Git 版本控制管理(第2版)》,人民邮电出版社

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值