How do I show the changes which have been staged?
I staged a few changes to be committed; how can I see the diff of all files which are staged for the next commit? I’m aware of git status, but I’d like to see the actual diffs – not just the names of files which are staged.
I saw that the git-diff(1) man page says
- git undo deleted files
- Git diff doesn't show changes for new added files
- Why does the “git index” have so many names?
- Getting Git-concept of “stage”
- why file in gitignore will be modified after android studio compile?
- Git. Undo staged changes in working directory, keeping staged area untouched
git diff [–options] [–] […]
This form is to view the changes you made relative to the index (staging area for the next commit). In other words, the differences are what you could tell git to further add to the index but you still haven’t. You can stage these changes by using git-add(1).
Unfortunately, I can’t quite make sense of this. There must be some handy one-liner which I could create an alias for, right?
12 Solutions collect form web for “How do I show the changes which have been staged?”
It should just be:
git diff --cached
--cached means show the changes in the cache/index (i.e. staged changes) against the current
--staged is a synonym for
Just to clarify the above statement,
--cached does not point to
HEAD, just difference with respect to
HEAD. If you cherry pick what to commit using
git add --patch (or
git add -p),
--staged will return what is staged.
A simple graphic makes this clearer:
Shows the changes between the working directory and the index. This shows what has been changed, but is not staged for a commit.
git diff –cached
Shows the changes between the index and the HEAD (which is the last commit on this branch). This shows what has been added to the index and staged for a commit.
git diff HEAD
Shows all the changes between the working directory and HEAD (which includes changes in the index). This shows all the changes since the last commit, whether or not they have been staged for commit or not.
There is a bit more detail on 365Git.
If you’d be interested in a visual side-by-side view, the diffuse visual diff tool can do that. It will even show three panes if some but not all changes are staged. In the case of conflicts, there will even be four panes.
Invoke it with
in your Git working copy.
If you ask me, the best visual differ I’ve seen for a decade. Also, it is not specific to Git: It interoperates with a plethora of other VCS, including SVN, Mercurial, Bazaar, …
See also: Show both staged & working tree in git diff?
git status -v also shows the staged changes!
(meaning you need to have staged —
git add — some changes. No staged changes, no diff with
git status -v.
It does that since Git 1.2.0, February 2006)
In its long form (default),
git status has an undocumented “verbose” option which actually display the diff between HEAD and index.
And it is about to become even more complete: see “Show both staged & working tree in git diff?” (git 2.3.4+, Q2 2015):
git status -v -v
You can use this command.
git diff --cached --name-only
--cached option of
git diff means to get staged files, and the
--name-only option means to get only names of the files.
From version 1.7 and later it should be:
git diff --staged
If you have more than one file with staged changes, it may more practical to use
git add -i, then select
6: diff, and finally pick the file(s) you are interested in.
If your intentions are to push-target a remote repo branch and your first pass at a commit change log were incomplete, you can correct the commit statement before pushing like this.
… make some changes …
git diff # look at unstaged changes git commit -am"partial description of changes"
… recall more changes unmentioned in commit …
git diff origin/master # look at staged but not pushed changes
… amend staged commit statement …
git commit --amend -m"i missed mentioning these changes ...." git push
For Staging Area vs Repository comparison use
$git diff --staged
For Working vs Repository comparison use
$ git diff
but if a file is changed and added to staging area (
$ git add fileName) and we try to see the difference with (
$ git diff). It will not return any difference since the file is in staging area and it will not be compared with the repository.
git gui and
git-cola are graphical utilities that let you view and manipulate the index. Both include simple visual diffs for staged files, and
git-cola can also launch a more sophisticated side-by-side visual diff tool.
See my closely related answer at How to remove a file from the index in git?, and also this official catalog of Git – GUI Clients.
USING A VISUAL DIFF TOOL
The Default Answer (at the command line)
The top answers here correctly show how to view the cached/staged changes in the
$ git diff --cached
$ git diff --staged which is an alias.
Launching the Visual Diff Tool Instead
The default answer will spit out the diff changes at the git bash (i.e. on the command line or in the console). For those who prefer a visual representation of the staged file differences, there is a script available within git which launches a visual diff tool for each file viewed rather than showing them on the command line, called
$ git difftool --staged
This will do the same this as
git diff --staged, except any time the diff tool is run (i.e. every time a file is processed by diff), it will launch the default visual diff tool (in my environment, this is kdiff3).
After the tool launches, the git diff script will pause until your visual diff tool is closed. Therefore, you will need to close each file in order to see the next one.
You Can Always Use
difftool in place of
diff in git commands
For all your visual diff needs,
git difftool will work in place of any
git diff command, including all options.
For example, to have the visual diff tool launch without asking whether to do it for each file, add the
-y option (I think usually you’ll want this!!):
$ git difftool -y --staged
In this case it will pull up each file in the visual diff tool, one at a time, bringing up the next one after the tool is closed.
Or to look at the diff of a particular file that is staged in the
$ git difftool -y --staged <<relative path/filename>>
For all the options, see the man page:
$ git difftool --help
Setting up Visual Git Tool
To use a visual git tool other than the default, use the
-t <tool> option:
$ git difftool -t <tool> <<other args>>
Or, see the difftool man page for how to configure git to use a different default visual diff tool.
Think about the
gitk tool also , provided with git and very useful to see the changes