如何查看Git提交中的更改?

2263

当我执行git diff COMMIT命令时,我看到的是该提交和HEAD之间的更改(就我所知),但我想要查看单个提交所做的更改。

我没有在diff/log上找到任何明显的选项可以给我这个输出。


9
可能是Shorthand for diff of git commit with its parent?的重复。 - Chris Maes
26个回答

2794

要查看特定COMMIT哈希的差异,其中COMMIT是提交的哈希:

git diff COMMIT~ COMMIT将显示该COMMIT的祖先与COMMIT之间的差异。有关命令的详细信息,请参见git diff的手册页面,有关~符号及其相关内容的详细信息,请参见gitrevisions

或者,git show COMMIT也会做类似的事情(包括提交的数据和它的差异,但不适用于合并提交)。请参见git show手册页面。

(另外,git diff COMMIT将显示该COMMIT与当前HEAD的差异。)


20
请注意,在 Thomson 和 Bourne shells(| 的同义词)以及 rc 及其派生版本(脱字符运算符),以及启用了扩展 glob 的 zsh 中,需要对 ^ 进行引用(not globbing operator)。 - Stephane Chazelas
4
请注意,HEAD^ 表示第一个父提交,如果提交具有多个父提交(即合并提交)。 - Mansour
27
git diff COMMIT~ COMMIT 对我有效,注意使用波浪线而不是插入符号。我在Windows 10上运行git版本2.6.1.windows.1。 - Juuso Ohtonen
17
@tradetree: 应该用某个提交的名称(例如SHA值)替换“COMMIT”这个词。 - Nick Matteo
142
我认为git show更适合这个问题,并应该首先提到这个建议。 - pypmannetjies
显示剩余13条评论

670

如 "Shorthand for diff of git commit with its parent?" 所提到的那样,您也可以使用 git diff 与以下内容一起使用:

git diff COMMIT^!

或者

git diff-tree -p COMMIT

使用git show命令,为了只关注差异,您需要执行以下操作:
git show --color --pretty=format:%b COMMIT

COMMIT参数是一个commit-ish

一个commit object或可以递归解引用为提交对象的object。以下都是提交对象:提交对象、指向提交对象的tag object、指向指向提交对象的标签对象的标签对象等。

请参见gitrevision "SPECIFYING REVISIONS"以引用提交对象。
另请参见“What does tree-ish mean in Git?”。


613

您还可以尝试这种简单的方法:

git show <COMMIT>

5
看起来这个做了完全不同的事情。 - Miserable Variable
16
只显示提交信息,不显示应用于该提交的代码更改的差异。 - k0pernikus
1
有时候,这个命令会显示提交信息。 - alfredo
4
对于我使用的 Git 版本 2.32.0,我能够像已接受答案一样同时看到提交消息和与上一次提交不同的文件差异/更改。需要明确的是,git show c411d33e 显示提交消息和文件更改,而 git diff c411d33e~ c411d33e 只显示文件更改。在这两种情况下,所显示的文件更改都是自提交祖先以来的。 - PatS
4
如果你**没有得到差异(diff)**,可能是一个合并提交(merge commit)。在这种情况下,你需要使用git show <COMMIT> --diff-merges=on - c z
显示剩余2条评论

121

git show会展示最近一次提交所做的更改。它等同于git show HEAD

git show HEAD~1会回到上一个提交。


73

我通常做:

git diff HEAD~1

显示关于上次提交的更改。如果您有更多的提交,请将数字1增加到您想要查看的提交diff数量。


6
要显示最新提交的更改,只需使用git show命令即可 ;) - xeruf
@xeruf 这只为我显示提交消息。 - codemonkey

67

使用:

git show <commit_sha>

这将向您展示该提交中的所有内容。您可以通过在两个提交SHA-1哈希之间放置一个空格来执行范围。

git show <beginning_sha> <ending_sha>

如果您经常进行变基操作,那么这非常有帮助,因为您的特性日志将全部在一行中。

如果您想查看最近的3个提交,则可以使用HEAD语法。

git show HEAD~3 HEAD

SHA-1哈希是唯一的可能性吗(这不是一个修辞问题)?例如,HEAD〜3呢? - Peter Mortensen
是的,你可以使用类似 git show HEAD~3 HEAD 这样的命令。虽然比其他 git 命令有点笨重,但它能够正常工作。 - Iwnnay

48

对我来说这很有效

git show COMMIT --compact-summary

显示下一个信息

在diffstat中输出扩展头信息的简要总结,例如文件创建或删除(“new”或“gone”),可选地带有符号链接的“+l”,以及更改模式的(“+x”或“-x”分别添加或删除可执行位)。 该信息放置在文件名部分和图形部分之间。 意味着--stat。


2
因为这正是我所需要的,所以我点了赞。我偶然发现了这个问题,因为“在提交中查看更改”可能意味着几件不同的事情。我想要看到已更改的文件,而不是实际上更改了什么。继续阅读,可以找到非常好的答案来查看_文件中更改了什么_。 - Andrew Falanga
2
很棒的答案。喜欢这个命令的输出格式。 - Binita Bharati
这里显示:致命错误:未识别的参数:--compact-summary - AG_HIHI
1
@AG_HIHI,听起来你的git版本没有这个选项,你可以在这里检查:https://git-scm.com/docs/git-show 搜索你特定的git版本文档,看看是否有--compact-summary选项参数,如果没有,那就升级到更新的版本。 - Pepe Alvarez

42

首先使用以下命令获取提交ID:

git log #to list all

或者
git log -p -1 #last one commit id

复制提交ID。

现在我们使用两种方法来列出特定提交的更改,

方法1:

git diff commit_id^! # 提交ID类似于1c6a6000asad012

方法2:

git show commit_id
For example: git show 1c6a600a

3
“^!”的意思是什么? - Martín Coll
3
^!是commit^..commit的简写,意味着将排除所有父级,并检查该提交中的差异。 - Mohideen bin Mohammed
我不是专家,但我有一个案例(涉及多个分支),其中 git log c^! 与 git log c^..c 并不完全相同。实际上它更好:git log c^..c 列出了太多的条目,而 git log c^! 做对了,所以这正是我长期寻找的。 - user829755

31

来自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>

使用中间的第三个:

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

同样来自于该手册,在底部的示例部分:

$ git diff HEAD^ HEAD      <3>

比较最近一次提交和它之前的提交版本。


3
您的修改将适用于 git diff HEAD HEAD^ - Richard
git diff HEAD^ HEAD 没有显示任何更改。 - user3690202
@user3690202,这意味着没有任何更改需要显示。实际上是这种情况吗? - user456814
怎么可能没有任何变化需要显示?如果你想查看最后一次提交,除非这是一个全新的仓库,否则肯定会有一些变化需要显示吧? - user3690202
@user3690202,使用Git可以创建一个“空提交”,它实际上不包含任何来自父提交的更改,尽管有内置保护措施检查并防止此类提交,但可以通过命令行选项覆盖。我怀疑您不会故意创建空提交,因此另一个可能性是您某种方式启用了预提交行结束符转换(或其他有趣的空格字符),这会欺骗Git认为实际上没有进行任何更改。您在哪个平台上运行Git? - user456814
@user3690202 可以使用命令:git diff "HEAD^" HEAD,这个命令对我有用。 - MartenBE

27

以下代码似乎可以完成任务;我使用它来展示合并所带来的变化。

git whatchanged -m -n 1 -p <SHA-1 hash of merge commit>

git log 也可以这样做吗?(因为 https://dev59.com/5Gkw5IYBdhLWcg3wQoSm#18585297) - VonC
git log --name-only - 用于列出更改的文件。或者使用 git log --name-status --find-renames - 获取更改文件列表及其更改类型(添加/修改/重命名等)。 - MichaelMoser
今天我学到了一些东西。谢谢!官方描述 显示每个提交引入的提交日志和差异输出。鼓励新用户使用git-log(1)代替。whatchanged命令与git-log(1)基本相同,但默认显示原始格式的差异输出并跳过合并。该命令主要是出于历史原因而保留的;许多在git log被发明之前通过阅读Linux内核邮件列表学习Git的人们的手指都习惯于输入它。 - Kesavan Muthuvel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接