Является ли git diff --staged таким же, как git diff --cached HEAD? - PullRequest
2 голосов
/ 12 марта 2020

Является ли git diff --staged таким же, как git diff --cached HEAD?

Кстати, git diff --cached здесь совпадает с git diff --cached HEAD.

Спасибо.

1 Ответ

3 голосов
/ 12 марта 2020

Для git diff, --staged и --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 покорно попытается преобразовать его в коммит ha sh ID, который затем завершается ошибкой, вызывая вышеуказанную ошибку.)

(Это исключение также применяется при создании несвязанной ветви, которая функционально очень похожа на этот начальный-пустой-репозиторий состояние: специальный файл HEAD содержит имя несуществующей ветви, поэтому HEAD сам по себе действителен только при разрешении в качестве имени ветви, а не при разрешении в виде коммита ha sh ID.)

...