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

Nic*_*ick 5 git

这两个命令似乎具有使它们显示相同信息的选项。

Aka*_*kai 5

除了--name-flag仅显示文件名之外,该命令(不带其他参数)还将显示索引工作目录git diff之间的差异(如此处的图表中所述)。

而该git status命令将显示工作树的整个当前状态(暂存、修改、删除、未跟踪等的文件)

但是,通过考虑-s缩短命令输出的标志status(通常仅显示名称),我们可能会遇到某些情况,这两个命令将为您提供“几乎”完全相同的输出。这完全取决于您已经做了什么在你的工作目录中。

例如,如果您这样做,您将获得工作目录与您的工作目录以及您的包括git status -s未跟踪文件的所有差异..(但假设您没有未跟踪文件..)HEADindex

另一方面,无论您是否已经上演了什么,如果您这样做git diff --name-only HEAD(请参见上述图表),您就有可能获得几乎相同的输出。

此外,结果几乎相同(不完全相同),因为git status -s显示了非常有用的附加信息:

  • 行开头的一个字母,用于总结状态(M 表示已修改,D 表示已删除,A 表示已添加,? 表示未跟踪的文件)
  • 显示已暂存内容的颜色代码(绿色表示已暂存,红色表示未暂存)。

所以,我们可以认为diff更适合查看实际文件内容的差异。这就是为什么不显示未跟踪的文件是diff有意义的。仅从我们拥有的东西(跟踪的文件)开始比较差异。

话虽如此,如果您想要一些有关实际更改的简洁输出(毕竟这是使用 的合理性--name-only),您应该真正考虑git status -s.


Nam*_*man 2

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

git diff --name-only
/src/main/java/com/core/First.java 
/src/main/java/com/core/Second.java
Run Code Online (Sandbox Code Playgroud)

另一方面,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")
Run Code Online (Sandbox Code Playgroud)