git log -1 -p stash@{0} 显示空补丁

git log -1 -p stash@{0} shows empty patch

要重现此行为,只需初始化一个新的 git 存储库,创建一个文件,添加并提交。现在再次编辑此文件(这次不添加,不提交)并存储。结果应如下所示:

$ git log stash@{0} --graph --decorate
*   commit C (refs/stash)
|\  Merge: A C
| |     WIP on master: A init
| |
| * commit B
|/      index on master: A init
|
* commit A (HEAD, master)
      init

A 和 C 之间的差异显示了预期的结果:

$ git diff stash@{0}^..stash@{0}
diff --git a/file b/file
index b1b7161..51bdcb4 100644
--- a/file
+++ b/file
@@ -1 +1,2 @@
+a new uncommited change
init

我希望命令的输出相同

$ git log stash@{0}

但是没有补丁。为什么会这样? (这与存储无关:如果您使用空提交、no-ff 等创建历史记录,行为相同)

Why does this happen?

因为 git log -1 -p 不显示 any 与多个 parents 提交的差异。为此需要其他选项。通常,您可能希望选择 git show 来显示单个提交以及补丁,这在很大程度上是等效的,但将 --cc 添加为默认选项。显式添加也会使您与 git log 有所不同。

还有其他选项用于控制合并提交的显示:您可以使用 -c 获得更详细的 --cc 形式,-m 获得所有的常规差异parents(A 和 B),或将其与 --first-parent 结合以获得从 A 到 C 的简单差异。