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

lak*_*tak 1364 git version-control diff git-diff

当我这样做时,git diff COMMIT我看到了提交和HEAD之间的变化(据我所知),但我希望看到单个提交所做的更改.

我没有在diff/log上找到任何明显的选项,它会给我输出.

Nev*_*nel 1759

要查看特定COMMIT哈希的差异 :

git diff COMMIT~ COMMIT会告诉你这个COMMIT祖先和祖先之间的区别COMMIT.有关命令和gitrevisions有关表示法及其朋友的详细信息,请参阅git diff的手册页. ~

或者,git show COMMIT将做一些非常相似的事情.(提交的数据,包括它的差异 - 但不适用于合并提交.)请参阅git show联机帮助页.

  • 我觉得git show更适合这个问题,应该是首先提到的建议. (80认同)
  • `git diff COMMIT~COMMIT`对我有用,注意代字号而不是插入符号.我在Windows 10上运行git版本2.6.1.windows.1. (21认同)
  • 注意`^`需要引用Thomson和Bourne shell(`|`的同义词)和`rc`及其派生词(插入符号运算符)和带有extendedglob的`zsh`(`not` globbing operator) (16认同)
  • @tradetree:单词COMMIT应该被替换为某个提交的名称,例如SHA sum. (14认同)
  • 注意,如果一个提交有多个父级(即合并提交),则“ HEAD ^”表示第一个父级。 (3认同)
  • 如果使用 bash,`COMMIT^ COMMIT` 可以缩写为 `COMMIT{^,}`。 (3认同)

Von*_*onC 466

如" 使用其父级的git提交的差异的简写? "中所述,您还可以使用git diff:

git diff COMMIT^!
Run Code Online (Sandbox Code Playgroud)

要么

git diff-tree -p COMMIT
Run Code Online (Sandbox Code Playgroud)

使用git show,你需要(为了专注于diff)来做:

git show --color --pretty=format:%b $COMMIT
Run Code Online (Sandbox Code Playgroud)

COMMIT参数是提交上下的:

commit对象或一个对象可以被递归地解除引用到一个提交对象.以下是所有承诺,ishes:提交对象,标签对象指向一个commit对象,指向一个指向commit对象等标签对象标签对象

请参阅gitrevision"SPECIFYING REVISIONS"以引用commit-ish.
另请参阅" Git中树的含义是什么? ".


Lak*_*han 308

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

git show <COMMIT>
Run Code Online (Sandbox Code Playgroud)

  • 这应该是答案。 (12认同)
  • 唉,这并没有显示合并提交的差异. (10认同)
  • 它只显示提交消息。不是应用于此提交的代码更改的差异。 (6认同)
  • 对于使用 git 版本 2.32.0 的我来说,我可以看到提交消息以及与先前提交的文件差异/更改(就像接受的答案一样)。需要明确的是, `git show c411d33e` 显示提交消息和文件更改,而 `git diff c411d33e~ c411d33e` 仅显示文件更改。在这两种情况下,显示的更改文件更改均来自提交祖先。 (5认同)
  • @k0pernikus 如果你**没有得到差异**,它可能是合并提交。在这种情况下,您需要“git show &lt;COMMIT&gt; --diff-merges=on”。 (5认同)
  • 看来这确实有所不同 (2认同)
  • @k0pernikus 这对我有用 (2认同)

Ada*_*lma 69

git show 显示最近提交中所做的更改.

相当于git show HEAD.

git show HEAD~1 带你回1提交.


Pep*_*rez 49

对我来说这很好用

\n
git show COMMIT --compact-summary\n
Run Code Online (Sandbox Code Playgroud)\n

显示下一个信息

\n
\n

输出扩展头信息的简明摘要,例如文件创建或删除(“新”或“消失”,如果\xe2\x80\x99是符号链接,则可选“+l”)和模式更改(“+x”或“-” x”分别用于在 diffstat 中添加或删除可执行位)。该信息位于文件名部分和图形部分之间。意味着--stat。

\n
\n

  • 投票因为这实际上是我正在寻找的。我偶然发现这个问题是因为“查看提交中的更改”可能意味着一些不同的事情。我想查看发生变化的文件,而不是它们实际上发生了什么变化。继续阅读以获取非常好的答案,了解_文件中发生了什么变化_。 (2认同)
  • 很好的答案。就像这个命令的输出格式一样。 (2认同)

Moh*_*med 30

首先使用获取提交ID,

git log #to list all
Run Code Online (Sandbox Code Playgroud)

要么

git log -p -1 #last one commit id
Run Code Online (Sandbox Code Playgroud)

复制提交ID.

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

方法1:

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

方法2:

git show commit_id
For example: git show 1c6a600a
Run Code Online (Sandbox Code Playgroud)

  • “ ^!”是什么意思? (2认同)
  • ^!是commit ^ .. commit的简写形式,这意味着将排除所有父级并检查该提交中的diff (2认同)

Iwn*_*nay 29

git show <commit_sha>
Run Code Online (Sandbox Code Playgroud)

这将向您展示该提交中的内容.我想你可以通过在两个提交sha之间放一个空格来做一个范围.

git show <beginning_sha> <ending_sha>
Run Code Online (Sandbox Code Playgroud)

如果您经常变基因,这非常有用,因为您的功能日志将全部连续.


小智 25

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>
Run Code Online (Sandbox Code Playgroud)

使用中间的第3个:

git diff [options] <parent-commit> <commit>
Run Code Online (Sandbox Code Playgroud)

同样来自同一手册页,位于底部的示例部分:

$ git diff HEAD^ HEAD      <3>
Run Code Online (Sandbox Code Playgroud)

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

不可否认,它的措辞有点令人困惑,因为它不那么令人困惑

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

  • 你的重写将适用于`git diff HEAD HEAD ^`. (3认同)

Ale*_*lex 25

我通常这样做:

git diff HEAD~1
Run Code Online (Sandbox Code Playgroud)

显示有关最后一次提交的更改。如果您有更多提交,只需将数字1增加到要查看的提交差异数即可。

  • 要显示上次提交的更改,只需使用“git show”;) (6认同)

Mic*_*ser 21

以下似乎可以胜任这项工作; 我用它来显示合并带来了什么.

git whatchanged -m -n 1 -p <SHA-1 hash of merge commit>
Run Code Online (Sandbox Code Playgroud)


Joh*_*est 11

另一种可能性

git log -p COMMIT -1


Irs*_*shu 10

您可以使用git diff HEAD HEAD^1父提交来查看差异.

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

  • 请注意,这将显示您添加的已删除内容,因为它将进行反向比较。你应该阅读 `diff` 命令的方式是:我需要在文件中更改什么才能从提交 `HEAD` 到提交 `HEAD^1`? (2认同)

Cha*_*ara 9

git difftool COMMIT^ <commit hash>
Run Code Online (Sandbox Code Playgroud)

如果您配置了difftool,也可以使用.

看到这里如何配置difftool 或手动页面点击这里

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


Myr*_*SC2 9

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


sta*_*cwl 7

我喜欢下面的命令来比较特定的提交及其最后的提交:

git diff <commit-hash>^-
Run Code Online (Sandbox Code Playgroud)

例:

git diff cd1b3f485^-
Run Code Online (Sandbox Code Playgroud)


bit*_*007 7

要检查完整的更改:

  git diff <commit_Id_1> <commit_Id_2>
Run Code Online (Sandbox Code Playgroud)

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

  git diff <commit_Id_1> <commit_Id_2> --name-only
Run Code Online (Sandbox Code Playgroud)

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


小智 7

以下代码将显示当前提交

git show HEAD
Run Code Online (Sandbox Code Playgroud)


Ber*_*san 7

检查文件更改的更简约方法(示例)

# 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
Run Code Online (Sandbox Code Playgroud)
# 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(+)
Run Code Online (Sandbox Code Playgroud)
# 3. Pick a file to check the differences
git show d58e5da myfolder12/file.py
Run Code Online (Sandbox Code Playgroud)

或者,也可以从列表中检查单个提交内的所有文件差异:

git show d58e5da
Run Code Online (Sandbox Code Playgroud)


Nik*_* G. 6

通过提交使用来查看作者和时间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'
Run Code Online (Sandbox Code Playgroud)

如果要查看哪些文件已更改,请使用上面"合并"行中的值运行以下命令git diff --stat a2a2894 3a1ba8f.

如果你想看到实际的差异,请运行 git --stat a2a2894 3a1ba8f


Bha*_*rat 6

获取提交中更改的文件列表:

git show --name-only commit_id

注意:以上命令不适用于合并 ID。


要获取合并提交 ID 中更改的文件列表:

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


查看提交中 特定文件的更改:git show commit_id:src/path/to/that/file


小智 5

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

两个都

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>...]'
Run Code Online (Sandbox Code Playgroud)

git diff <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.
+

Run Code Online (Sandbox Code Playgroud)

(这些是我的根提交和 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.
Run Code Online (Sandbox Code Playgroud)

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