当工作目录清理时,git staging区域包含什么?

时间:2015-02-05 18:53:36

标签: git

暂存区域是否包含上次提交内容的快照? 或其他什么?


如果git status显示:

On branch master
nothing to commit, working directory clean

然后我发出git diff --cached

所以将HEAD与什么进行比较?

2 个答案:

答案 0 :(得分:1)

前提条件阅读Read about Git objects, particularly trees and blobs, first

简短回答:索引始终包含HEAD中文件blob的ID,以及一组用于跟踪文件更改的标志。它包含最后一次提交的快照,也不是树对象(下面的例外)。

The really long answer can be read here

稍长答案:索引(.git/index)始终存储HEAD中所有文件的blob ID和文件路径列表,以及有关文件的元数据(权限,修改时间) ,业主等......)。

索引还可以包含预先计算的tree objects (how Git stores directories)以加快提交。它还存储有关冲突的信息。

所以"空" index包含所有文件路径,其blob ID,有关文件的元信息以及存储冲突信息的空间的列表。因为它只存储blob ID(160位),所以索引避免了HEAD的冗余。对于像Perl和Git这样的大型项目,我项目的索引文件大小不到1K到500K。

您可以使用libgit2来搜索索引,该Git::Raw包含许多编程语言的包装器,例如Perl中的{{3}}。

答案 1 :(得分:1)

工作目录是否干净并不与暂存区域包含的内容有任何关系。暂存区域包含已提交进行提交的内容(例如,使用git add)。是的,没有上演的任何文件将处于与HEAD相同的状态,除非你做了一些奇怪的事情。 git diff --cached正在将暂存区域的内容与HEAD进行比较(它也可以称为git diff --staged)。由于git commit将暂存区域的内容转换为提交,git diff --staged会显示您现在提交时将提交的内容。

由于您的git status输出显示“无需提交”,因此它已经告诉您没有分阶段更改,并且git diff --staged不会报告任何内容。