What is the difference between git diff HEAD
and git diff --staged
? I tried both but both give the same output.

- 11,566
- 10
- 64
- 92

- 2,008
- 6
- 20
- 21
-
2check here: http://stackoverflow.com/questions/1587846/how-do-i-show-the-changes-which-have-been-staged – Viacheslav Kondratiuk May 15 '13 at 10:09
-
@Johnsyweb sorry; "exactly" same output – vhd May 15 '13 at 10:14
-
3`--staged` is a synonym for `--cached`. The diagram in http://stackoverflow.com/questions/1587846/how-do-i-show-the-changes-which-have-been-staged explains the difference. Marked as a duplicate – Abizern May 15 '13 at 10:33
-
1Soon (Git 2.3.4+, Q2 2015), `git status -v -v` will show clearly the difference between the two diffs: see [my answer below](http://stackoverflow.com/a/29116428/6309) – VonC Mar 18 '15 at 07:36
5 Answers
Suppose this output for git status
:
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: y
#
# 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: x
#
As you see, there is one file modified but not staged for commit, and a new file added that is ready to be committed.
git diff --staged
will only show changes to files in the "staged" area.
git diff HEAD
will show all changes to tracked files. If you have all changes staged for commit, then both commands will output the same.

- 22,354
- 11
- 51
- 57
-
Shouldn't it be untracked files at the place of tracked files ? Because when I do git status without adding a file, it shows the unstaged file as untracked file. – vhd May 15 '13 at 11:31
-
If it is a new file that you have not added previously, it will show as untracked and not appear in any `git diff` variant. If the file has been added and committed before, and you have made modifications to it, then it will show as 'not staged for commit' – Carlos Campderrós May 15 '13 at 11:56
-
Is there a way to `diff` changes between the staged version and the unstaged version of the same file? – Geremia Feb 01 '16 at 19:45
-
@geremia `git diff --staged` does that, if I understood you correctly. – Carlos Campderrós Feb 02 '16 at 10:36
-
2@CarlosCampderrós Oh, yes, as long as you specify the file, that will diff its staged vs. unstaged versions. – Geremia Feb 02 '16 at 18:58
git diff
View difference between Stage and Working Directorygit diff --staged
View difference between HEAD and Stagegit diff HEAD
View difference between HEAD and Working Directory
HEAD
is a reference to the last commit in the currently checked-out branch.- Staging area, stage and index all mean the same thing
- Unstaged changes exist in our Working Directory, but Git hasn’t recorded them into its version history yet.
- Staged changes are a lot like unstaged changes, except that they’ve been marked to be committed the next time you run git commit
-
19
-
@NickWeavers I removed the graphics because they are pretty distracting, and do not add to the answer. – episodeyang Jun 24 '19 at 22:49
-
anyone have any idea what tool was used to create the top graphic? – creativemateriel Aug 08 '19 at 10:45
-
3@creativemateriel I think TikZ was used: https://www.overleaf.com/learn/latex/TikZ_package – 01F0 Jun 04 '20 at 06:18
-
-
@Premraj Is it also correct to say that git diff HEAD compares the HEAD to working directory, NOT including untracked files? – geronimo Apr 13 '22 at 19:06
You will be able to see more easily the difference between the two diff with the upcomming (Git 2.3.4+, Q2 2015) git status -v -v
See commit 4055500 from Michael J Gruber mjg
, it does a good job explaining the difference between git diff HEAD
and git diff --staged
:
commit
/status
: show the index-worktree diff with-v -v
git commit
andgit status
in long format show the diff between HEAD and the index when given-v
. This allows previewing a commit to be made.They also list tracked files with unstaged changes, but without a diff.
Introduce '
-v -v
' which shows the diff between the index and the worktree in addition to theHEAD
index diff. This allows a review of unstaged changes which might be missing from the commit.In the case of '
-v -v
', additional header lines
Changes to be committed:
# and
Changes not staged for commit:
are inserted before the diffs, which are equal to those in the status part; the latter preceded by 50*"
-
" to make it stick out more.

- 1,262,500
- 529
- 4,410
- 5,250
Another edge case difference: In a newly created git repo, where only git init
has been run so far, git diff HEAD
will result in a fatal error (ambiguous argument 'HEAD') while git diff --staged
will produce no output.

- 655
- 1
- 7
- 22