首页 > 解决方案 > git diff --staged 是否与 git diff --cached HEAD 相同?

问题描述

git diff --staged一样吗git diff --cached HEAD

顺便说一句,git diff --cachedgit diff --cached HEAD这里一样。

谢谢。

标签: gitdiff

解决方案


For git diff, --stagedand--cached是同义词:使用任何你喜欢的。

省略HEAD通常意味着与 相同的东西HEAD,因此它们几乎100% 相同,但有一个例外:在尚未提交的新存储库中可以git diff --staged正常工作git diff --staged HEAD但不能:

$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   README.md

$ git diff --cached
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..9daeafb
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+test
$ git diff --cached HEAD
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

(这是因为git diff --[cached|staged]它足够聪明,可以注意到这HEAD是无效的,并改为与空树进行比较。但是,如果您HEAD自己输入,git diff尽职尽责地尝试将其解析为提交哈希 ID,然后失败,产生上述错误。 )

(这个例外也适用于创建孤儿分支时,它在功能上与这个initial-empty-repository状态非常相似:特殊HEAD文件保存了一个不存在的分支的名称,所以HEAD它本身只有在被解析为一个分支时才有效名称,而不是在被解析为提交哈希 ID 时。)


推荐阅读