Для 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.)