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

时间:2016-01-28 19:05:41

标签: git

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

2 个答案:

答案 0 :(得分:3)

除了仅显示文件名的--name-flag之外,git diff命令(不带其他参数)将显示索引工作目录之间的差异(正如in the diagaram here所述)。

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

答案 1 :(得分: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")