ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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


y
yaya

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

git diff COMMIT~ COMMIT 将向您展示该 COMMIT 的祖先与 COMMIT 之间的区别。有关命令的详细信息,请参阅 git diff 的手册页,以及有关 ~ 表示法及其朋友的 gitrevisions

或者,git show COMMIT 会做一些非常相似的事情。 (提交的数据,包括其差异 - 但不包括合并提交。)请参阅 git show manpage

(还有 git diff COMMIT 会告诉你那个 COMMIT 和 head 之间的区别。)


请注意,^ 需要在 Thomson 和 Bourne shell(那里 | 的同义词)和 rc 及其派生词(插入符号运算符)和启用扩展全局的 zsh 中引用(not globbing 运算符)
请注意,如果提交有多个父级(即合并提交),则 HEAD^ 表示第一个父级。
git diff COMMIT~ COMMIT 对我有用,请注意波浪号而不是插入符号。我在 Windows 10 上运行 git 版本 2.6.1.windows.1。
@tradetree:COMMIT 这个词应该被替换为一些提交的名称,例如 SHA 总和。
我觉得 git show 更适合这个问题,应该是首先提到的建议。
P
Pavel

如“Shorthand for diff of git commit with its parent?”中所述,您还可以将 git diff 用于:

git diff COMMIT^!

或者

git diff-tree -p COMMIT

使用 git show,您需要(为了只关注 diff)执行以下操作:

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

COMMIT 参数是 commit-ish

提交对象或可以递归取消引用到提交对象的对象。以下都是commit-ish:一个提交对象,一个指向提交对象的标签对象,一个指向一个指向提交对象的标签对象的标签对象,等等。

请参阅 gitrevision "SPECIFYING REVISIONS" 以引用 commit-ish。
另请参阅“What does tree-ish mean in Git?”。


R
Reggie Pinkham

你也可以试试这个简单的方法:

git show <COMMIT>

这似乎做了一些完全不同的事情
它只显示提交消息。不是适用于此提交的代码更改的差异。
这应该是答案。
@k0pernikus 它对我有用
有时,此命令会显示提交消息。
P
Peter Mortensen

git show 显示在最近提交中所做的更改。它等价于 git show HEAD

git show HEAD~1 将您带回一次提交。


A
Alex

我通常这样做:

git diff HEAD~1

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


要显示上次提交的更改,只需使用 git show ;)
I
Iwnnay

利用:

git show <commit_sha>

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

git show <beginning_sha> <ending_sha>

如果您经常变基,这将非常有用,因为您的功能日志将全部排成一行。

如果您碰巧想查看最后 3 次提交,您可以使用 HEAD 语法

git show HEAD~3 HEAD

SHA-1 哈希是唯一的可能性(不是反问)吗?例如,HEAD~3 怎么样?
是的,你可以使用像 git show HEAD~3 HEAD 这样的东西,它比其他 git 命令有点笨拙,但它可以工作。
P
Peter Mortensen

首先使用获取提交 ID,

git log #to list all

或者

git log -p -1 #last one commit id

复制提交 ID。

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

方法一:

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

方法二:

git show commit_id
For example: git show 1c6a600a

^! 是什么意思?
^!是 commit^..commit 的简写,这意味着将排除所有父母并检查该提交中的差异
我不是专家,但我有一个案例(涉及多个分支),其中 git log c^!与 git log c^..c 不完全相同。事实上它要好得多: git log c^..c 列出了太多条目,而 git log c^!做了正确的事,所以这就是我一直在寻找的东西
佚名

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>

同样来自同一手册页,位于底部的 Examples section 中:

$ git diff HEAD^ HEAD      <3>

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

诚然,它的措辞有点令人困惑,它会不那么令人困惑,因为

将最近的提交与之前的提交进行比较。


您的改写将适用于 git diff HEAD HEAD^
git diff HEAD^ HEAD 不显示任何更改。
@user3690202 这意味着没有任何更改要显示。真的是这样吗?
怎么可能没有任何显示变化?如果您想查看最后一次提交,除非它是一个全新的存储库,否则肯定会有一些更改要显示?
user3690202 可以使用 Git 进行“空提交”,该提交实际上不包含来自父级的任何更改,尽管有一个内置的保护措施可以检查并防止这种情况,尽管它可以用命令行选项覆盖。我怀疑您是否会故意创建一个空提交,因此另一种可能性是您以某种方式对(或其他有趣的空白内容)进行了预提交行结束转换,这会诱使 Git 认为实际上没有进行任何更改。你在哪个平台上运行 Git?
J
José Alvarez

对我来说,这很好用

git show COMMIT --compact-summary

显示下一个信息

输出扩展标题信息的简明摘要,例如文件创建或删除(“new”或“gone”,如果是符号链接,则可选“+l”)和模式更改(“+x”或“-x”用于添加或删除diffstat 中的可执行位)。信息放在文件名部分和图形部分之间。暗示--stat。


赞成,因为这实际上是我正在寻找的。我偶然发现了这个问题,因为“查看提交中的更改”可能意味着一些不同的事情。我想查看更改的文件,而不是实际更改的文件。继续阅读以获得非常好的答案,以查看文件中的更改。
很好的答案。就像这个命令的输出格式一样。
这里说:致命:无法识别的参数:--compact-summary
@AG_HIHI 听起来您的 git 版本没有该选项,您可以在此处查看:git-scm.com/docs/git-show 如果选项参数 --compact-summary 可用,则在文档中搜索您的特定 git 版本,如果没有,则升级到一个较新的。
P
Peter Mortensen

以下似乎可以完成这项工作;我用它来显示合并带来的内容。

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

这也适用于 git log 吗? (因为 stackoverflow.com/a/18585297/6309
git log --name-only - 用于列出更改的文件。或 git log --name-status --find-renames - 获取具有更改类型的更改文件列表(添加/修改/重命名等)
f
frogatto

另一种可能:

git log -p COMMIT -1

P
Peter Mortensen

我喜欢下面的命令来比较一个特定的提交和它的最后一个提交:

git diff <commit-hash>^-

例子:

git diff cd1b3f485^-

I
Irshu

您可以使用 git diff HEAD HEAD^1 查看与父提交的差异。

如果您只想查看文件列表,请添加 --stat 选项。


这就是你的意思, git diff HEAD^1 HEAD
请注意,这会将您添加的内容显示为已删除,因为它将进行反向比较。您应该阅读 diff 命令的方式是:我需要在文件中进行哪些更改才能从提交 HEAD 到提交 HEAD^1
P
Peter Mortensen
git difftool COMMIT^ <commit hash>

如果你已经配置了你的 difftool 也是可能的。

请参阅此处如何configure difftool。或手册页 here

此外,您可以使用 git diff-tree --no-commit-id --name-only -r <commit hash> 查看在给定提交哈希中更改/提交了哪些文件。


IMO git difftool -d 比普通的 git difftool 更有用。
P
Peter Mortensen

要按提交查看作者和时间,请使用 git show COMMIT。这将导致这样的事情:

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'

如果您想查看哪些文件已更改,请使用上面 Mergegit diff --stat a2a2894 3a1ba8f 中的值运行以下命令。

如果您想查看实际差异,请运行 git --stat a2a2894 3a1ba8f


“如果您想查看实际差异,请运行 git --stat a2a2894 3a1ba8f”。我认为您的意思是 git diff a2a2894 3a1ba8funknown option: --stat
git show COMMIT 已显示正常提交的变更集。它只会在合并时不显示。
b
bit_cracker007

检查完整的更改:

  git diff <commit_Id_1> <commit_Id_2>

仅检查更改/添加/删除的文件:

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

注意:为了检查 diff 而没有在两者之间提交,您不需要放置提交 ID。


M
MyrionSC2

如果您只想查看最新提交中的更改,只需 git show 即可。


不工作。只显示提交信息
j
jinson

以下代码将显示当前提交

git show HEAD

P
Peter Mortensen

此命令将为您获取 Git 父提交哈希:

git log -n 2 <commit-hash>

之后git diff-tool <commit-hash> <parent-commit-hash>

例子:

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.

在这之后

git difftool 7f65b9a9d3820525766fcba285b3c678e889fe3b c3a61f17e14e2b80cf64b172a45f1b4826ee291f

P
Peter Mortensen

我在 Windows 10 上运行 Git 版本 2.6.1.windows.1,所以我需要对 Nevik 的答案稍作修改(波浪号而不是插入符号):

git diff COMMIT~ COMMIT

另一种选择是引用插入符号:

git diff "COMMIT^" COMMIT

S
Sergey Miletskiy

还可以查看特定文件的两次提交之间的更改。

git diff <commit_Id_1> <commit_Id_2> some_dir/file.txt

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

一些答案错过了一个特殊情况。如何查看根提交所做的更改,因为它没有父/祖先。

两个都

git diff <root_commit>^..<root_commit>

git diff <root_commit>~..<root_commit>

抛出错误。

$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>^!

显示 diff btw root commit 和 HEAD。像这样:

$ 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.
+

(这些是我的根提交和 HEAD 的所有提交所做的更改)。

对于根提交

我发现只有

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

作品。

像这样:

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

(我的根提交只添加了自述文件)


P
Peter Mortensen

如果要检查源更改 in a graphical view,请使用:

gitk (your commit id goes here)

例如:

gitk HEAD~1 

我不明白为什么这个答案被否决了。我同意命令行和基于文本的东西是要走的路,但 gitk 提供了很多有用的信息。
gitk 不是 git,它是一个特殊的包,它并不存在于可以安装 git 的每个操作系统上。tig 和其他许多工具一样也是很好的工具。
S
Sergey

git difftool "HASH_in_history" -- "path_to_file"