git status和git diff --name-only有什么区别?

9
这两个命令似乎有选项可以显示相同的信息。

如果答案解决了问题,请选择它并让社区受益。 - Naman
2个回答

5
除了只显示文件名的--name-flag外,git diff命令(不带其他参数)将显示您的索引工作目录之间的差异(如此处的图表所示)。
git status命令将显示您的工作树的整个当前状态(已暂存、已修改、已删除、未跟踪等文件)。
然而,通过考虑缩短status命令输出的-s标志(通常仅显示名称),我们可以有一些情况,这两个命令将给您“几乎”相同的输出。这完全取决于您在工作目录中已经做了什么。
例如,如果您执行git status -s,则会获取所有来自您的工作目录与您的HEADindex的差异,包括未跟踪的文件。(但是假设您没有未跟踪的文件...)
另一方面,无论您已经暂存或未暂存什么,如果您执行git diff --name-only HEAD(请参见上述图表),则有机会获得“几乎”相同的输出。
此外,结果是“几乎”相同的(而不是“完全”相同),因为git status -s显示了非常有用的附加信息:
  • 一行开头的字母总结了状态(M表示修改、D表示删除、A表示添加、?表示未跟踪的文件)
  • 颜色代码显示已经暂存的内容(绿色表示已暂存,红色表示未暂存)。
因此,我们可以认为diff更适合查看实际文件内容的差异。这就是为什么通过diff不显示未跟踪的文件是有意义的原因。从我们拥有的东西(已跟踪的文件)开始比较差异。
所有这些说法之后,如果您想要关于实际更改的简洁输出(毕竟这是使用--name-only的理性),您应该真正考虑git status -s

2

一方面,git diff --name-only 返回准备在下一次提交时被暂存的文件的名称。如下所示:

git diff --name-only
/src/main/java/com/core/First.java 
/src/main/java/com/core/Second.java

另一方面,git status 不仅提供了当前工作目录中待提交的文件的详细信息,还与你的分支源进行了比较。

git status

On branch myBranch
Your branch is up-to-date with 'origin/myBranch'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   /src/main/java/com/core/First.java
        modified:   /src/main/java/com/core/Second.java

no changes added to commit (use "git add" and/or "git commit -a")

1
是的,但这很有用,因为您可以使用git diff比较分支和提交,而不会被细节淹没。git status只会告诉您当前分支的情况。 - eadsjr

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