GitHub 上实际显示的合并提交的差异是什么?

Leo*_*ves 7 git version-control merge dvcs github

考虑以下提交页面:

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

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

在此输入图像描述

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

在此输入图像描述

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

pet*_*ulc 6

Git 提交实际上是快照

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

但是,是的,例如,git log -p显示了有关第一个父级的补丁,以使事情变得更容易。GitHub/Lab 的行为也是一样的。

家长已下令

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

默认情况下,始终采用第一个父级。例如,是(在第二张图像上)HEAD^的第一个父级,是( )的第一个父级的第一个父级。这可以被 的第二个父项so覆盖,因此。HEAD6f01964HEAD~2HEAD2bb48b5^<number>HEAD^2HEADb0417C3


tor*_*rek 4

petrpulc 的答案实质上是正确的,我已经投了赞成票,但为了具体解决 GitHub 问题,GitHub 显示此差异的做法是完全忽略第二个父级。

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

git log -p --no-walk --first-parent -m cc5b002a5140e2d60184de42554a8737981c846c
Run Code Online (Sandbox Code Playgroud)

或者,更简单:

git show --first-parent cc5b002a5140e2d60184de42554a8737981c846c
Run Code Online (Sandbox Code Playgroud)

(我们需要--no-walkingit log来防止 Git 查看更多提交,而 whilegit show暗示了这一点。我们需要--first-parent使 Git 只查看第一个父级,对于git log,我们需要-m-c--cc强制git log显示补丁,因为-p通常会跳过显示补丁对于合并,即使我们用来--first-parent修剪剩余的父项。)