git diff 不显示新文件

Posted

技术标签:

【中文标题】git diff 不显示新文件【英文标题】:git diff does not show new file 【发布时间】:2019-09-24 21:51:55 【问题描述】:

我在工作树中创建了一个新文件file.txtgit 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

同样的空结果。

如果我添加文件然后 diff 到 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 版本上。

为什么差异是空的? 通常,我不会太在意,但我正在使用的另一个工具是依赖 diff 输出。

【问题讨论】:

Can I use git diff on untracked files?的可能重复 【参考方案1】:

由于新文件在您创建时没有被 git 跟踪,因此 git 无法识别发生了什么变化。当您执行git add file 时,该文件将移动到 git 的暂存区域,现在正在对其进行跟踪。因此 git diff 将照常工作,因为 git 现在拥有有关您文件的所需信息。

git docs 提供有关未跟踪文件的更多信息,如下所示 -

请记住,工作目录中的每个文件都可以位于两个文件之一 状态:跟踪或未跟踪。跟踪的文件是在 最后一张快照;它们可以是未修改的、修改的或暂存的。简而言之, 跟踪的文件是 Git 知道的文件。

未跟踪的文件就是其他一切 — 您工作中的任何文件 不在您上次快照中且不在您的目录中的目录 暂存区。当您第一次克隆存储库时,您的所有文件 将被跟踪和不修改,因为 Git 刚刚检查了它们并且 你还没有编辑任何东西。

当您编辑文件时,Git 将它们视为已修改,因为您已更改 他们自您上次提交以来。当你工作时,你有选择地展示这些 修改文件,然后提交所有这些分阶段的更改,然后循环 重复。

【讨论】:

啊,我想我被 git-diff 文档的措辞吓到了,它指出“差异是您可以告诉 Git 进一步添加到索引中的内容,但您仍然没有。 "显然,一个新创建的文件可以满足这一点。 说 git 缺少区分未跟踪字段所需的信息有点误导。 git 知道索引在该路径上“没有内容”,并且 可以 比较文件与该路径 - 就像它比较未暂存的更改与索引一样,即使(实际上,因为)它们还没有还添加了。 git 不会在 diff 中显示未跟踪的文件是一个设计决定,仅此而已。 @BalzGuenat - 是的,文档中的那一行是有问题的。不幸的是,git 文档有很多“有点准确”的陈述,他们试图用非技术术语解释发生了什么。

以上是关于git diff 不显示新文件的主要内容,如果未能解决你的问题,请参考以下文章

我可以让“git diff”只显示行号和更改的文件名吗?

Xcode 10 storyboard和info.plist git diff没有正确显示

让 git diff --stat 显示完整的文件路径

将文件恢复到以前的版本后 git diff 没有显示差异?

gitlog和diff区别

将文件恢复到以前的版本后 git diff 没有显示差异?