这与大小无关。它与 git 如何“看到”以及您要求的区别有关。
如果一个文件被跟踪(它在索引或 HEAD 中),那么工作树中但不在索引中的更改是unstaged。但是,如果一个文件没有被跟踪,那么工作树中的变化是untracked;它们还没有达到未上演的水平,它们不会处于任何一种差异中。
好的。所以当你第一次创建一个文件时,不管它有没有大小,它根本不在 git 的权限范围内(它是未跟踪的),所以它不是 any diff 的一部分:
$ touch Z # this one has no size
$ echo testing > ZZ # this one has size
$ git diff # (crickets...)
$ git diff --cached # (crickets...)
然后当你 add 那个文件时,现在 git 知道它(它被跟踪)。索引和工作空间之间仍然没有差异,因为索引与工作空间相同;您只是将这些文件从后者复制到前者!但是现在 HEAD 和索引之间的区别确实存在:
$ git add .
$ git diff # (crickets...)
$ git diff --cached
diff --git a/Z b/Z
new file mode 100644
diff --git a/ZZ b/ZZ
new file mode 100644
好的,现在这些文件 在 git 的监督下,因为它们在索引中。所以现在如果我们对其中一个进行更改(在工作树中),那么索引和工作树之间会有差异(未分级):
$ echo testing2 >> ZZ
$ git diff
diff --git a/ZZ b/ZZ
--- a/ZZ
+++ b/ZZ
@@ -1 +1,2 @@
testing
+testing2
反过来也是一样。为了说明我的意思,我将添加并提交所有内容;现在没有简单的差异,正如预期的那样:
$ git add .
$ git commit -m'xxxx'
$ git diff # (crickets...)
$ git diff --cached # (crickets...)
现在我将从索引中删除ZZ,使用rm,从HEAD中删除,使用commit:
$ git rm --cache ZZ
rm 'ZZ'
$ git commit -m'removed'
现在,索引和工作树之间再一次没有区别,即使文件 ZZ 仍在工作树中:
$ git diff # (crickets...)
$ ls
Z ZZ
这是因为,由于 ZZ 不再位于 HEAD 或工作树中,它再次未被跟踪;它再次不在 git 的权限范围内。