【Git学习】工作区、暂存区、本地仓库原理

                            从理解暂存区窥视三大区域的联系

(一)暂存区是什么

所谓的暂存区实际只是一个简单的索引文件,即 .git文件夹下的index文件。

那么index文件中保存了什么东西?直接打开会显示乱码,我们可以使用 git ls-files --stage 命令来查看index文件中内容。

从上图可以看到,index文件中保存了两行记录。每一条记录保存了当前暂存区管理的文件名、文件快照的HASH值。

第二列长度为40的HASH值对应 .git/objects文件夹中的文件,git使用前两位作为文件夹,后38位作为文件名。我们可以先使用git cat-file -p查看一下文件中保存了什么内容?

里面保存的就是a.txt中的内容。

(二).git/objects文件夹中都保存了什么?

.git/objects实际就是git的对象仓库。在这个目录下,git将文件分为四种类型,blob类型、tree类型、commit类型和tag类型。blob类型的文件仅仅存储文件内容,不包含文件创建时间、访问权限等信息,相同的内容对应同一个blob文件。如下图所示:当我们更改了a.txt文件中的内容时,会在objects目录下新生成一个Blob文件,并更新index索引。我们查看新的blob文件内容会发现,a.txt中的内容已经更改为新的内容。

【Git学习】工作区、暂存区、本地仓库原理_第1张图片

假设现在我们新建一个文件d.txt,文件中的内容为aaaa,即a.txt更改前的内容一致,看看index索引会发生什么!

【Git学习】工作区、暂存区、本地仓库原理_第2张图片

 会发现,objects目录下并没有生成新的文件。而index索引重新指向了7284a这个blob文件--原来a.txt指向的文件。这里可以看出blob文件只和内容相关,相同的内容使用同一个blob文件。注意,blob文件大小都不是很大,那是因为git在生成blob文件的时候使用了zlib对文件进行了压缩。

小结:git在使用git add添加文件进暂存区时,会根据文件的内容计算出HASH值,如果HASH值存在,说明该内容已在git仓库中存在,只需要更新index索引即可。如果HASH不存在,则在objects目录下新建一个blob文件,文件夹取HASH值前两位,文件名取后38位,然后更新index索引。

【Git学习】工作区、暂存区、本地仓库原理_第3张图片

(三)git commit命令做了什么?

当我们使用git commit命令将暂存区的内容保存到本地仓库会发生什么?

上图可以看到生成了一个HASH f3dd718,下面我们来查看这个序列对应什么文件.

【Git学习】工作区、暂存区、本地仓库原理_第4张图片

从上图看到,当我们使用git commit命令,会生成一个commit类型的文件,该文件内容包含了:目录树、上一次提交、作者信息、和提交信息。继续查看目录中中的内容:

【Git学习】工作区、暂存区、本地仓库原理_第5张图片

可以看出,目录树中记录了所有的子目录和文件信息。我们可以通过下图来表示这个状态:

【Git学习】工作区、暂存区、本地仓库原理_第6张图片

 小结:使用git commit命令时,git会在objects目录下生成一个commit类型的文件和多个tree类型的文件(取决于tree类型是否已存在)。commit文件中保存了当前版本的所有的文件状态,并有一个索引指向上一次提交。以此类推。

你可能感兴趣的:(Git工具)