Git-原理相关归纳-非入门

题记-知道的越多,不知道的也越多

曾经以为自己对 Git 的使用还蛮熟练的了,尽管具体原理不清楚,但可以应付大多数情况,至少比大部分人都熟了。直到有一次在处理分支合并时,发现合并后丢失了一些提交。于是只能试着回滚导致丢失的合并,但是在回滚合并时,居然有不同的父节点可以选择。
这个时候我意识到,还差得远呢。知道的越多,不知道的也越多。


如何存储基本对象

对象

四种 Git Object 对象存放在 .git/objects 中:blob,tree,commit,tag。
blob:存储单个完整的文件内容。
tree:存储一个完整的目录结构(起点为根目录),包含目录下每个文件的权限、类型、SHA1以及文件名、文件blob、子目录tree。
其实tree就代表了文件目录。
下图只是提交了子目录下的一个文件,但是commit指向的tree的内容是从根目录开始的,因为子目录的一个文件发生变化,那整个目录的哈希就会发生变化。

commit:存储根目录 tree 的 SHA1,父节点 commit 的 SHA1,此次提交的作者,时间和备注。

分区

三个分区:工作目录,Index 索引区域,Git仓库。
工作目录:未暂存的改动文件。
Index 索引区域:暂存区域,通过 add 加入,每个改动文件都会创建一个 blob 对象。
Git 仓库:通过 commit 加入,创建多个 tree,一个commit对象,commit 指向根目录的 tree。


问题和提示们

1. 如果提交两个文件名不同,但是内容相同的文件,有几个 blob ?

只有1个, blob 存储文件具体内容,并根据内容生成 SHA1 ,再以 SHA1 命名文件,也因此他们的文件名必然会是一样的。就跟字典似的。

2. Git 每次提交存储的是文件的改动部分,还是整个文件内容?

是整个文件内容,也因此 Git 在拉取更新时,只要找到对应的一个 blob 即可,不需要再不断往前查找所有改动。

3. 只要 add 过,那就会创建 blob,意味着就可以还原!所以,经常 add 吧!(磁盘空间不要钱吗?!)

4. 一次 commit 到底包含了什么东西?

每一个发生变动文件对应的 blob 对象,所有受到影响的目录以及父目录的 tree 对象,记录此次提交指向的新 tree 、一个父提交以及提交信息的 commit 对象。


参考

一文讲透 Git 底层数据结构和原理
这才是真正的GIT——GIT内部原理
GIT第五讲BLOB、Commit和Tree组件
git的深入浅出-3、.git文件下的剖析和commit、blob、tree对象之间的关系和基本操作和暂存区、工作区的使用

posted @ 2021-04-19 19:21  尼克多摩雄  阅读(65)  评论(0编辑  收藏  举报