ChatGPT解决这个技术问题 Extra ChatGPT

How can I see the changes in a Git commit?

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.


y
yaya

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.)


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)
Note that HEAD^ implies first parent in case a commit has multiple parents (ie merge commit).
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.
@tradetree: the word COMMIT is supposed to be replaced with the name of some commit, e.g. the SHA sum.
I feel like git show is more appropriate for this question and should be the suggestion mentioned first.
P
Pavel

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?".


R
Reggie Pinkham

You can also try this easy way:

git show <COMMIT>

It seems this does something quite different
It only shows the commit message. Not the diff of the code changes applied for this commit.
This should be the answer.
@k0pernikus it does for me
Sometimes, this command shows the commit message.
P
Peter Mortensen

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.


A
Alex

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.


To show the changes of the last commit, simply use git show ;)
I
Iwnnay

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

Is a SHA-1 hash the only possibility (not a rhetorical question)? What about, e.g., HEAD~3?
Yes, you could use something like git show HEAD~3 HEAD It's a little clunkier than other git commands, but it works.
P
Peter Mortensen

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

What does the ^! mean??
^! is the shorthand for commit^..commit which means will exclude all parents and check diff in that commit
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
佚名

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.


Your rewording would apply to git diff HEAD HEAD^.
git diff HEAD^ HEAD doesn't display any changes.
@user3690202 so that implies that there aren't any changes to display. Is that actually the case?
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?
@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?
J
José Alvarez

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.


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.
Great answer. Like the output format of this command.
Here it says: fatal: unrecognized argument: --compact-summary
@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.
P
Peter Mortensen

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>

Would that work too with git log? (because of stackoverflow.com/a/18585297/6309)
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)
f
frogatto

Another possibility:

git log -p COMMIT -1

P
Peter Mortensen

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

git diff <commit-hash>^-

Example:

git diff cd1b3f485^-

I
Irshu

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.


This is what you mean, git diff HEAD^1 HEAD
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?
P
Peter Mortensen
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.


IMO git difftool -d is more usable than plain git difftool.
P
Peter Mortensen

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 <you@you.com>
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.


"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.
git show COMMIT already shows the changeset for normal commits. It only won't show it for merges.
b
bit_cracker007

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.


M
MyrionSC2

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


Not works. Only show the commit message
j
jinson

The following code will show the current commit

git show HEAD

P
Peter Mortensen

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 <souparno.majumder@gmail.com>
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 <souparno.majumder@gmail.com>
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

P
Peter Mortensen

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

S
Sergey Miletskiy

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

git diff <commit_Id> on/specific/file.txt
A
Ankit Raj Goyal

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)


P
Peter Mortensen

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

gitk (your commit id goes here)

For example:

gitk HEAD~1 

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.
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.
S
Sergey

git difftool "HASH_in_history" -- "path_to_file"