Is git diff --staged same as git diff --cached HEAD?
By the way, git diff --cached is the same as git diff --cached HEAD here.
Thanks.
Is git diff --staged same as git diff --cached HEAD?
By the way, git diff --cached is the same as git diff --cached HEAD here.
Thanks.
For git diff, --staged and --cached are synonyms: use whichever you like.
Omitting HEAD generally implies the same thing as HEAD, so these are almost 100% identical, but there is one exception: in a new repository that has no commits yet, git diff --staged works and git diff --staged HEAD does not:
$ 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>...]'
(This is because git diff --[cached|staged] is clever enough to notice that HEAD is invalid, and to diff against the empty tree instead.  If you type in HEAD yourself, though, git diff dutifully attempts to resolve it to a commit hash ID, which then fails, producing the above error.)
(This exception also applies when creating an orphan branch, which is functionally very similar to this initial-empty-repository state: the special HEAD file holds the name of a branch that does not exist, so HEAD itself is only valid when being resolved as a branch name, not when being resolved as a commit hash ID.)
