Git diff未显示新文件。

7
我在工作树中创建了一个名为file.txt的新文件。 git status正确地显示了它:
$ git status
On branch mybranch
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        file.txt

nothing added to commit but untracked files present (use "git add" to track)

然而,git diff 未显示任何内容。
$ git diff

我发现一些相关问题表明分页器可能存在问题,所以我尝试了以下操作:

git --no-pager diff file.txt

并且

GITPAGER=cat git diff file.txt

使用相同的空结果。

如果我添加文件,然后将其与HEAD进行diff操作,我会得到正确的差异。

$ git add file.txt
$ git diff --cached
diff --git a/file.txt b/file.txt
new file mode 100644
index 0000000..f2d7933
--- /dev/null
+++ b/file.txt
@@ -0,0 +1 @@
+asds
\ No newline at end of file

这全部是关于Windows 10和最新的git版本的。 为什么差异为空? 通常,我不会在意那么多,但我使用的另一个工具依赖于差异输出。

3
可能是Can I use git diff on untracked files?的重复问题。 - ElpieKay
1个回答

5
由于你创建的新文件没有被git跟踪,因此git无法识别发生了什么变化。当你执行git add file时,文件移动到git的暂存区,现在它正在被跟踪。因此,git diff将像往常一样工作,因为git现在具有有关文件的所需信息。 git文档提供了有关未跟踪文件的更多信息,如下所示-
请记住,你的工作目录中的每个文件都可以处于跟踪或未跟踪状态。被跟踪的文件是上次快照中的文件;它们可以是未修改的、已修改的或者已暂存的。简而言之,被跟踪的文件是Git知道的文件。 未跟踪的文件就是其他所有文件——你工作目录中的任何不在上次快照中且不在暂存区的文件。当你克隆一个仓库时,因为Git只是将它们检出并且你还没有编辑任何内容,所有文件都将被跟踪和未修改。 当你编辑文件时,Git会认为它们被修改了,因为你在上次提交后对它们进行了更改。在你工作的过程中,你可以选择性地将这些修改的文件暂存,然后提交所有已暂存的更改,并重复这个周期。

1
啊,我猜我被git-diff文档的措辞绊倒了,其中它说“这些差异是你可以告诉Git进一步添加到索引中但你还没有的”。显然,一个新创建的文件会满足这个条件。 - Balz Guenat
2
说Git缺少信息以便对未跟踪的文件进行差异比较有点误导。Git知道索引在该路径上“没有内容”,并且可以根据这一点将文件与之进行差异比较——就像它将未暂存的更改与索引进行比较一样,尽管(事实上,因为)它们尚未被添加。Git不显示未跟踪的文件在差异中只是一个设计决策,而不仅仅是因为缺乏信息。 - Mark Adelsberger
1
@BalzGuenat - 是的,文档中那一行是有问题的。不幸的是,git文档中有很多“有点准确但又不太准确”的陈述,他们试图用非技术术语解释正在发生的事情。 - Mark Adelsberger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接