git的暂存区原理

暂存区根本不是一个区(从底层来看),暂存区只是一个index文件,用来记录仓库里的文件和工做区里的文件这二者之间的对应关系(所谓的“跟踪”)git

我先简单说说暂存区的原理 我先在工做区创建一个文件file.txt,此文件未被跟踪,因此仓库(.git目录)里没有对应的文件 当我输入git add file.txt进行跟踪时,git会将这个文件复制到仓库里,并进行更名,例如更名为d0fd9678ea839e7e01b3b0709cf5da41a276c006,同时在所谓暂存区的index文件里记录一笔---工做区的file.txt <对应为> 仓库的d0fd9678ea839e7e01b3b0709cf5da41a276c006 我开始编辑file.txt,添加了几行数据,而后我再输入git add file.txt进行再跟踪时,git会将这个新文件复制到仓库里,并进行更名,例如更名为f8764f23d79b59e7c2d006935257823963592a18,同时在所谓暂存区的index文件里,修改以前的记录,将工做区的file.txt对应为仓库的f8764f23d79b59e7c2d006935257823963592a18,之前的记录d0fd9678ea839e7e01b3b0709cf5da41a276c006被盖掉了。但d0fd9678ea839e7e01b3b0709cf5da41a276c006这个文件仍是在仓库里没动。 以此类推3d

因此,工做区里的文件是否被跟踪,其实就是暂存区的index文件里是否有该文件的记录 若是一个项目有100个文件都被跟踪,那暂存区也只有1个index文件,里面有100行,每行记录每一个文件在两区的对应关系(工做区和仓库),注意啊,还没到提交(commit)这个环节哦。 每一次git add时,都会修改这个index文件(暂存区),能够屡次git addit

当git commit时,git会对这个index文件取一个名字,好比97ffc2598b5e8c50750d5d515a5fbd536531c810,并保存起来 第二次提交时,git会对当时的index文件取一个名字,好比fdd9024d981ac44d7548ae377545cb9d799dce52,再保存起来 同时保存每一个index文件的父辈是谁,好比fdd9024d981ac44d7548ae377545cb9d799dce52的爸爸就是97ffc2598b5e8c50750d5d515a5fbd536531c810 这些就是清单文件,有了清单文件,恢复就简单了 我要恢复某个commit,只要找到那个commit的清单文件,从清单文件里所记录的清单到仓库去找到每个文件,并把这些文件复制到工做区,并更名为文件原来真正的名字。原理

相关文章
相关标签/搜索