2316

When I do git diff COMMIT I see the changes between that commit and HEAD (as far as I know), but I would like to see the changes that were made by that single commit.

I haven't found any obvious options on diff / log that will give me that output.

1

26 Answers 26

2850

To see the diff for a particular COMMIT hash, where COMMIT is the hash of the commit:

git diff COMMIT~ COMMIT will show you the difference between that COMMIT's ancestor and the COMMIT. See the man pages for git diff for details about the command and gitrevisions about the ~ notation and its friends.

Alternatively, git show COMMIT will do something very similar. (The commit's data, including its diff - but not for merge commits.) See the git show manpage.

(also git diff COMMIT will show you the difference between that COMMIT and the head.)

18
  • 21
    Note that the ^ needs to be quoted in the Thomson and Bourne shells (synonym for | there) and rc and its derivatives (caret operator) and in zsh with extendedglob enabled (not globbing operator) Mar 24, 2014 at 14:34
  • 4
    Note that HEAD^ implies first parent in case a commit has multiple parents (ie merge commit).
    – Mansour
    Nov 15, 2015 at 21:19
  • 27
    git diff COMMIT~ COMMIT works for me, notice the tilde instead of caret. I'm running git version 2.6.1.windows.1 on Windows 10. Nov 24, 2015 at 10:58
  • 17
    @tradetree: the word COMMIT is supposed to be replaced with the name of some commit, e.g. the SHA sum. May 12, 2016 at 19:00
  • 142
    I feel like git show is more appropriate for this question and should be the suggestion mentioned first. Oct 12, 2016 at 12:00
675

As mentioned in "Shorthand for diff of git commit with its parent?", you can also use git diff with:

git diff COMMIT^!

or

git diff-tree -p COMMIT

With git show, you would need (in order to focus on diff alone) to do:

git show --color --pretty=format:%b COMMIT

The COMMIT parameter is a commit-ish:

A commit object or an object that can be recursively dereferenced to a commit object. The following are all commit-ishes: a commit object, a tag object that points to a commit object, a tag object that points to a tag object that points to a commit object, etc.

See gitrevision "SPECIFYING REVISIONS" to reference a commit-ish.
See also "What does tree-ish mean in Git?".

0
628

You can also try this easy way:

git show <COMMIT>
6
  • 6
    It seems this does something quite different Jun 20, 2018 at 18:01
  • 18
    It only shows the commit message. Not the diff of the code changes applied for this commit.
    – k0pernikus
    Sep 10, 2019 at 17:06
  • 1
    Sometimes, this command shows the commit message.
    – alfredo
    Mar 14, 2022 at 0:48
  • 5
    For me with git version 2.32.0, I see both the commit message as well as the file diffs/changes from the previous commit (just like the accepted answer does). To be clear, git show c411d33e shows both commit message and file changes and git diff c411d33e~ c411d33e shows just the file changes. In both cases changes file changes shown are from the commits ancestor.
    – PatS
    Jul 14, 2022 at 20:52
  • 5
    @k0pernikus If you're not getting the diff it may be a merge commit. You need git show <COMMIT> --diff-merges=on in this case.
    – c z
    Nov 25, 2022 at 10:21
126

git show shows the changes made in the most recent commit. It is equivalent to git show HEAD.

git show HEAD~1 takes you back one commit.

0
74

I usually do:

git diff HEAD~1

To show the changes regarding the last commit. If you have more commits just increase the number 1 to how many commits diff you want to see.

2
  • 6
    To show the changes of the last commit, simply use git show ;)
    – xeruf
    Mar 25, 2021 at 16:02
  • @xeruf that does only shows the commit message for me.
    – codemonkey
    May 29, 2023 at 11:57
69

Use:

git show <commit_sha>

This will show you just what's in that commit. You can do a range by just putting a space between the two commit SHA-1 hashes.

git show <beginning_sha> <ending_sha>

which is pretty helpful if you're rebasing often because your feature logs will all be in a row.

If you happen to want to look at the last 3 commits you can use the HEAD syntax

git show HEAD~3 HEAD
2
  • Is a SHA-1 hash the only possibility (not a rhetorical question)? What about, e.g., HEAD~3? Apr 11, 2021 at 9:37
  • Yes, you could use something like git show HEAD~3 HEAD It's a little clunkier than other git commands, but it works.
    – Iwnnay
    Apr 13, 2021 at 23:13
50

For me this works just fine

git show COMMIT --compact-summary

Which shows the next information

Output a condensed summary of extended header information such as file creations or deletions ("new" or "gone", optionally "+l" if it’s a symlink) and mode changes ("+x" or "-x" for adding or removing executable bit respectively) in diffstat. The information is put between the filename part and the graph part. Implies --stat.

4
  • 2
    Upvoted because this was actually what I was looking for. I stumbled onto this question because "see changes in commit" can mean a few different things. I wanted to see the files that changed, not actually what changed in them. Keep reading for very good answers to seeing what changed in the file. Dec 29, 2021 at 21:04
  • 2
    Great answer. Like the output format of this command. Apr 29, 2022 at 7:58
  • Here it says: fatal: unrecognized argument: --compact-summary
    – AG_HIHI
    Jul 7, 2022 at 9:28
  • 1
    @AG_HIHI It sounds to me that your git version does not have that option, you can check here: git-scm.com/docs/git-show Search the documentation for your specific git version if the option argument --compact-summary is available, if not, then upgrade to a newer one. Jul 7, 2022 at 17:01
43

First get the commit ID using,

git log #to list all

Or

git log -p -1 #last one commit id

Copy commit id.

Now we use two methods to list changes from a specific commit,

Method 1:

git diff commit_id^! #commit id something like this 1c6a6000asad012

Method 2:

git show commit_id
For example: git show 1c6a600a
3
  • 3
    What does the ^! mean?? Dec 20, 2017 at 18:31
  • 3
    ^! is the shorthand for commit^..commit which means will exclude all parents and check diff in that commit Dec 21, 2017 at 7:27
  • I'm not an expert but I have a case (with multiple branches being involved) where git log c^! is not exactly the same as git log c^..c. In fact it's much better: git log c^..c listed too many entries while git log c^! did the right thing, so this is what I was looking for for a long time
    – user829755
    Apr 3, 2018 at 9:16
31

From the man page for git-diff(1):

git diff [options] [<commit>] [--] [<path>…]
git diff [options] --cached [<commit>] [--] [<path>…]
git diff [options] <commit> <commit> [--] [<path>…]
git diff [options] <blob> <blob>
git diff [options] [--no-index] [--] <path> <path>

Use the 3rd one in the middle:

git diff [options] <parent-commit> <commit>

Also from the same man page, at the bottom, in the Examples section:

$ git diff HEAD^ HEAD      <3>

Compare the version before the last commit and the last commit.

Admittedly it's worded a little confusingly, it would be less confusing as

Compare the most recent commit with the commit before it.

6
  • 3
    Your rewording would apply to git diff HEAD HEAD^.
    – Richard
    Jun 26, 2014 at 15:56
  • git diff HEAD^ HEAD doesn't display any changes. Jun 7, 2015 at 17:16
  • @user3690202 so that implies that there aren't any changes to display. Is that actually the case?
    – user456814
    Jun 8, 2015 at 2:39
  • How can there not be any changes to display? If you want to view the last commit, surely unless it is a completely new repository there will be some changes to display? Jun 9, 2015 at 19:06
  • @user3690202 it's possible to make an "empty commit" with Git that doesn't actually contain any changes from the parent, although there is a built-in safeguard that checks for and prevents this, though it is overridable with a command line option. I doubt that you would intentionally create an empty commit, so another possibility is that you somehow have pre-commit line-ending conversion on (or other funny whitespace stuff) that is tricking Git into thinking that no changes have actually been made. What platform are you running Git on?
    – user456814
    Jun 10, 2015 at 0:21
28

The following seems to do the job; I use it to show what has been brought in by a merge.

git whatchanged -m -n 1 -p <SHA-1 hash of merge commit>
3
  • Would that work too with git log? (because of stackoverflow.com/a/18585297/6309)
    – VonC
    Oct 14, 2014 at 17:52
  • git log --name-only - for listing the changed files. Or git log --name-status --find-renames - to get the list of changed files with the kind of change (added/modified/renamed, etc) Jan 29, 2021 at 1:31
  • Something I learned today. Thanks! Official DESCRIPTION ` Shows commit logs and diff output each commit introduces.` New users are encouraged to use git-log(1) instead. The whatchanged command is essentially the same as git-log(1) but defaults to show the raw format diff output and to skip merges. The command is kept primarily for historical reasons; fingers of many people who learned Git long before git log was invented by reading Linux kernel mailing list are trained to type it.` Aug 22, 2023 at 17:11
25

Another possibility:

git log -p COMMIT -1
0
17

I like the below command to compare a specific commit and its last commit:

git diff <commit-hash>^-

Example:

git diff cd1b3f485^-
12

You could use git diff HEAD HEAD^1 to see the diff with the parent commit.

If you only want to see the list of files, add the --stat option.

2
  • 1
    This is what you mean, git diff HEAD^1 HEAD Sep 26, 2018 at 11:34
  • 2
    Note that this will show what you added as removed, as it will do a reverse comparison. The way you should read the diff command is: what would I need to change in the file to get from commit HEAD to commit HEAD^1?
    – brainplot
    Jan 25, 2019 at 0:34
11
git difftool COMMIT^ <commit hash>

is also possible if you have configured your difftool.

See here how to configure difftool. Or the manual page here.

Additionally, you can use git diff-tree --no-commit-id --name-only -r <commit hash> to see which files been changed/committed in a give commit hash.

1
  • 1
    IMO git difftool -d is more usable than plain git difftool.
    – ks1322
    Jul 18, 2022 at 14:21
10

To see author and time by commit, use git show COMMIT. Which will result in something like this:

commit 13414df70354678b1b9304ebe4b6d204810f867e
Merge: a2a2894 3a1ba8f
Author: You <[email protected]>
Date:   Fri Jul 24 17:46:42 2015 -0700

     Merge remote-tracking branch 'origin/your-feature'

If you want to see which files had been changed, run the following with the values from the Merge line above, git diff --stat a2a2894 3a1ba8f.

If you want to see the actual diff, run git --stat a2a2894 3a1ba8f.

2
  • "If you want to see the actual diff, run git --stat a2a2894 3a1ba8f". I think you mean git diff a2a2894 3a1ba8f or else unknown option: --stat.
    – 林果皞
    Nov 21, 2018 at 8:56
  • git show COMMIT already shows the changeset for normal commits. It only won't show it for merges.
    – Mecki
    Mar 26, 2021 at 10:51
9

For checking complete changes:

  git diff <commit_Id_1> <commit_Id_2>

For checking only the changed/added/deleted files:

  git diff <commit_Id_1> <commit_Id_2> --name-only

NOTE: For checking diff without commit in between, you don't need to put the commit ids.

8

If you just want to see the changes in the latest commit, simply git show will give you that.

0
8

The following code will show the current commit

git show HEAD
7

More minimalist approach for checking file changes (example)

# 1. Checkout a branch and see the list of commits
git log --oneline -5

# > Output
9b9b1f8 (HEAD -> master) Updated ABC
d58e5da chore: Added files
5a4aa2c chore: Added my pipeline
bb2b0b7 feat: Added ABC
473f711 feat: Added ZYX
# 2. Pick a commit hash and check which files were modified
git show --stat --oneline d58e5da

# > Output
d58e5da chore: Added versioning files
 Someabcfile                            | 18 ++++++++++++++++++
 myfolder/file.py                       | 19 +++++++++++++++++++
 myfolder/file.js                       |  7 +++++++
 myfolder/file.txt                      |  1 +
 4 files changed, 45 insertions(+)
# 3. Pick a file to check the differences
git show d58e5da myfolder12/file.py

Or, alternatively, check all file differences within a single commit from the list:

git show d58e5da
7

Get list of files changed in a commit:

git show --name-only commit_id

Note: Above command will not work for merge ids.


To get list of files changed in a merge commit id:

git log -m -1 --name-only commit_id


View changes in a specific file within a commit: git show commit_id:src/path/to/that/file

1
  • it's better to use git show commit_id -- src/path/to/that/file to get color in output.
    – Eric
    Aug 31, 2023 at 2:22
6

A few answers miss a special case. How to view changes made by the Root Commit as it does not have a parent/ancestor.

Both

git diff <root_commit>^..<root_commit>

and

git diff <root_commit>~..<root_commit>

throw an error.

$git diff 27e521ca73a46b2d3a28568dc49fced81e46aaea~ 27e521ca73a46b2d3a28568dc49fced81e46aaea
fatal: ambiguous argument '27e521ca73a46b2d3a28568dc49fced81e46aaea~': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

git diff <root_commit>^!

shows diff btw root commit and HEAD. Like so:

$ git diff 27e521ca73a46b2d3a28568dc49fced81e46aaea^!
diff --git a/file1.txt b/file1.txt
new file mode 100644
index 0000000..80f3f1a
--- /dev/null
+++ b/file1.txt
@@ -0,0 +1,5 @@
+Create the first file.
+
+Add some placeholder text to first file.
+
+
diff --git a/file2.txt b/file2.txt
new file mode 100644
index 0000000..66e494f
--- /dev/null
+++ b/file2.txt
@@ -0,0 +1,6 @@
+This is the second file.
+
+It has an uncommited commit.
+
+We use it to demo default `git diff` behaviour.
+

(These are changes made by all commits btw my root commit and HEAD).

For Root Commit

I find only

git show --color --pretty=format:%b <root_commit_hash>

works.

Like so:

$ git show --color --pretty=format:%b 27e521ca73a46b2d3a28568dc49fced81e46aaea

diff --git a/README b/README
new file mode 100644
index 0000000..12a04f0
--- /dev/null
+++ b/README
@@ -0,0 +1,6 @@
+# git-diff-demo
+
+This repo documents the demo of the git diff command.
+We will have options, and use cases.

(My root commit added only the README)

1
  • hi, what is root commit?
    – Chan Kim
    May 26, 2023 at 5:59
4

This command will get you the Git parent commit-hash:

git log -n 2 <commit-hash>

After that git diff-tool <commit-hash> <parent-commit-hash>

Example:

bonnie@bonnie ~/ $ git log -n 2 7f65b9a9d3820525766fcba285b3c678e889fe3

commit 7f65b9a9d3820525766fcba285b3c678e889fe3b
Author: souparno <[email protected]>
Date:   Mon Jul 25 13:17:07 2016 +0530

CSS changed to maintain the aspect ratio of the channel logos and to fit them properly.

commit c3a61f17e14e2b80cf64b172a45f1b4826ee291f
Author: souparno <[email protected]>
Date:   Mon Jul 25 11:28:09 2016 +0530

The ratio of the height to width of the channel images are maintained.

After this

git difftool 7f65b9a9d3820525766fcba285b3c678e889fe3b c3a61f17e14e2b80cf64b172a45f1b4826ee291f
4

I'm running Git version 2.6.1.windows.1 on Windows 10, so I needed a slight modification to Nevik's answer (tilde instead of caret):

git diff COMMIT~ COMMIT

Another option is to quote the caret:

git diff "COMMIT^" COMMIT
3

It is also possible to review changes between two commits for a specific file.

git diff <commit_Id_1> <commit_Id_2> some_dir/file.txt
1
  • git diff <commit_Id> on/specific/file.txt
    – CallMarl
    Feb 12, 2021 at 10:25
2

In case of checking the source change in a graphical view, use:

gitk (your commit id goes here)

For example:

gitk HEAD~1 
2
  • I don't understand why this answer was downvoted. I agree that command line and text based stuff is the way to go but gitk gives a lot of useful information.
    – ShellFish
    Sep 25, 2019 at 13:12
  • 3
    gitk is not git it's spécifique package and it doesn't exist on every OS where git could be installed.tig is also good tools as many others.
    – CallMarl
    Feb 12, 2021 at 10:32
-5
  1. You can click on each commit on the specific address of git to view
  2. If you submit with a tool, you can pass show history
2

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.