为什么git diff --name-only不显示任何修改的文件?

时间:2018-10-16 17:02:21

标签: git

请注意(我正在使用posh-git):

C:\xyz\git [master ↑2 +27 ~0 -0 !]> git diff --name-only
C:\xyz\git [master ↑2 +27 ~0 -0 !]>

27个文件夹处于未登台状态,每个文件夹都有一些文件。没有进行任何更改。

为什么不显示任何文件?

编辑1

以下简单的脚本演示了该问题:

C:\xyz> mkdir git


    Directory: C:\xyz


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       10/16/2018   1:20 PM                git


C:\xyz> cd git
C:\xyz\git> git init
Initialized empty Git repository in C:/xyz/git/.git/
C:\xyz\git [master]> echo hello > 1.txt
C:\xyz\git [master +1 ~0 -0 !]> git diff --name-only
C:\xyz\git [master +1 ~0 -0 !]> git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        1.txt

nothing added to commit but untracked files present (use "git add" to track)
C:\xyz\git [master +1 ~0 -0 !]>

编辑2

根据https://git-scm.com/docs/git-diff

git diff [<options>] [--] [<path>…​] 
  

此表格用于查看更改   您相对于索引(下一次提交的暂存区域)所做的。在   换句话说,差异就是您可以告诉Git进一步的区别   添加到索引中,但您还没有。您可以通过以下方式进行这些更改   使用git-add [1]。

据我所知,这意味着上面记录中的git diff --name-only命令应列出1.txt

1 个答案:

答案 0 :(得分:2)

请注意,git diff可以做很多不同的事情,包括(但不限于):

  • 将一次提交与另一次提交进行比较
  • 比较对索引的任何提交
  • 比较对工作树的任何提交
  • 比较索引到工作树

正如您刚刚在编辑中指出的那样,您正在选择最后一个选项。

当您选择将索引与工作树进行比较时,要比较的文件列表完全由索引内容控制。 未跟踪的所有文件将被完全忽略。这不同于git status将索引与工作树进行比较的方式,但是为git diff节省了很多时间,因为它不必查找任何可能无法跟踪的文件(通常这很慢操作)。

如果您希望Git使用某种占位符的索引条目来知道文件的存在,请考虑使用git add --indent-to-add,或者简称为git add -N(大写N)。我还应该提到,这种状态(“伪造的”)已经打破了很长时间,因此Git的许多版本在行为上都很奇怪。也是just updated in 2.19 to correct the git diff output

  
      
  • “ git diff”比较索引和工作树。对于路径   添加了intent-to-add位后,该命令将显示全部内容   其中已添加,但路径本身未标记为新路径   文件。现在默认情况下它们显示为新的。
  •