GitHub 上实际显示的合并提交有何差异?

What is the diff of a merge commit actually showing on GitHub?

考虑以下提交页面:

https://github.com/SignalR/SignalR/commit/cc5b002a5140e2d60184de42554a8737981c846c

通常在 Git 中,一次提交是在先前代码库之上应用的一组更改,因此,考虑以下树:

查看 1ca1b6b 的差异将在左侧显示截至 ca2cac9 的代码库,在右侧显示该提交中应用的更改。通过合并提交,我们在左侧看到了什么?即考虑以下树:

如果我们在 GitHub 上查看提交 1e25f98,左边是什么? 06f5be1?那么更复杂的树呢?还是三个分支之间的合并?它只是显示历史上最后一个共同点之间的差异吗?

Git 提交实际上是快照

... 因此,您需要指定两个提交以进行区分。例如。 git diff HEAD^ HEAD。如果未指定,第二个引用将设置为 HEAD。

但是是的,例如 git log -p 显示关于 的补丁首先 parent 让事情变得更容易。 GitHub/Lab 的行为是一样的。

Parents有序

并且合并提交的第一个 parent 指向您在调用 git merge 之前所处的提交。 (你的头在哪里。)

默认情况下,始终采用第一个 parent。例如HEAD^HEAD的第一个parent(第二张图6f01964),HEAD~2是第一个[=的第一个parent HEAD 的 43=](2bb48b5)。这可以被 ^<number> 覆盖,因此 HEAD^2HEAD 的第二个 parent,因此 b0417C3.

实质上是正确的,我赞成它,但要具体解决 GitHub,GitHub 所做的显示此差异的操作是忽略第二个 parent完全。

您可以在命令行中使用以下命令查看相同的差异:

git log -p --no-walk --first-parent -m cc5b002a5140e2d60184de42554a8737981c846c

或者,更简单:

git show --first-parent cc5b002a5140e2d60184de42554a8737981c846c

(我们需要 git log 中的 --no-walk 来防止 Git 查看更多提交,而 git show 暗示它。我们需要 --first-parent要使 Git 只查看第一个 parent,而对于 git log,我们需要 -m-c--cc 来强制 git log 来显示一个补丁,因为 -p 通常会跳过显示合并的补丁,即使我们使用 --first-parent 到 trim 离开剩余的 parents。)