2015-02-05 91 views
1

暂存区域是否包含上次提交内容的快照? 还是别的?工作目录干净时,git临时区域包含什么?


如果git status显示:

On branch master 
nothing to commit, working directory clean 

那么如果我发出git diff --cached

所以HEAD相比呢?

+1

'git ls-files --stage --debug' – 2015-02-05 20:47:53

回答

1

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

由于您的git status输出显示“Nothing to commit”,它已经告诉您没有阶段性更改,并且git diff --staged应该不报告任何内容。

1

先决条件阅读Read about Git objects, particularly trees and blobs, first

简短回答:索引总是包含HEAD中文件的斑点的ID,再加上一堆标志来跟踪对文件的更改。它不包含而不是包含上次提交的快照,也不是树对象(以下例外)。

The really long answer can be read here

稍长回答:关于文件的索引(.git/index)总是存储在HEAD的所有文件的BLOB ID和文件路径的列表,以及元数据(权限,修改时间,业主,等...) 。

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

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

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