Git暂存区原理

来源:互联网 发布:mac 便签固定在桌面 编辑:程序博客网 时间:2024/05/29 08:38

首先我们有个工作区,让后我们把.git目录当成是Git的工作目录,在这个工作目录里面有个git的对象库。我们假设工作区理有如图所示的树形结构:
这里写图片描述

第一次commit的时候

在第一次add都还没有进行的时候,我们的暂存区还没有被创建出来,git的对象库中也是空的。当我们执行git add的时候,.git目录下面多了个index文件,这个index文件就是我们所说的暂存区,每一个索引都有一个40位的16进制SHA-1 Hash以及他对应的文件名,这里我们就截取6位,除了这两个之外,索引中还包含了他的文件模式和权限和stage number (表示他的合并状态),时间戳等等。
每一个索引都是和对象库中的对象是一一对应的,这个index文件中除了一些索引之外他还维护了一些提前计算好的tree对象的内容(也就是工作区中的一个个tree对象),在我们要提交的时候,他就可以很迅速的根据我们已经提前算好的内容生成一个tree对象然后添加到历史记录里。
当我们做git commit的时候生成了两个tree对象,这时git对象库中有四个对象,然后生成了一个commit对象指向我们顶层的tree对象,我们的分支名以及head标签就指向了这个commit对象:表示我们处于master分支,而且master的最后一个提交是4f809a这样的一个commit。

修改工作区时

这里写图片描述
当我们写该file2这样的一个文件,当我们执行git add的时候 我们会发现在对象库中新创建了一个对象,那么暂存区中指向file2的索引就会被指向这个新对象的索引替换掉,这时暂存区就会重新计算一下顶层tree对象的内容,当我们执行git commit的时候,我们直接使用这个已经计算好的内容,创建出一个tree对象,然后生成一个新的commit对象指向这个新生成的顶层目录,并且维护了他的父提交,最后head引用和master引用就指向了这个提交,表明现在在master分支上,而master的最后一个提交是commit e45f9c这个提交。

git rm,mv内部运行原理

这里写图片描述
当运行 git rm file2.txt时,相当于把工作区中的这个文件以及暂存区中的这个文件索引都删掉了。
当运行git rm –cached file2.txt时,只是把暂存区中的索引去掉。
当运行git mv file2.txt file3.txt时,工作区中的文件被重命名了,而索引区中的原file2的索引被删除掉了,然后重新添加了一条索引。由于他只是一个重命名的操作,文件的内容并没有变,也就是说根据文件内容计算出来的SHA-1 Hash也不会变,所以他还是指向原来同一个对象。暂存区中的 这些索引在更新的时候都会重新计算一下所需要生成的tree对象的内容在提交的时候就可以直接生成tree对象,这也是暂存区一个提高git效率的地方

0 0
原创粉丝点击