使 git diff 显示与 Github 相同的结果,但来自很久以前

Make git diff show the same result as Github, but from a long time ago

每当你执行一个拉取请求时,你会得到这个 PR 的变化的一个很好的差异,与主人。

我希望能够保存这些 PR - 实际上是这些差异,以便研究特定主题。

但是,无法将 html 页面正确保存为 html 或 pdf。

因此,在该站点成员的帮助下,我找到了 diff2html,它将差异导出到 html。

使用这个答案:

我做到了git diff feature/BRANCH_I_AM_INTERESTED_IN...master | diff2html -i stdin -F diff.html

然而,这给了我很多很多结果。它包括许多后来更改的文件 - 而不是在合并 PR 时。

我猜这是为了与该分支的最新版本进行比较,与当前 当前 .

的 master 进行比较

然而,PR diff 是分支与主分支在过去的比较

那么,有没有办法获取 PR 的差异 - 换句话说,获取分支和主节点的差异,但在合并 PR 时?

首先,让我们修正这个命令的语法:

git diff feature/BRANCH_I_AM_INTERESTED_IN...master

您观察的原因:

However, this gives me many many results. It includes many many files that were changed at a much later time...

是因为你翻转了树枝。当您将 3 点语法与 diff 一起使用时,它会在右侧显示自分支拆分后的所有更改。 (这里有一个 quick cheat sheet 的点语法,涵盖了 difflog。)

为了查看将分支 feature/BRANCH_I_AM_INTERESTED_IN 合并到 master 的 PR 中的更改,您需要的命令应该是:

git diff master...feature/BRANCH_I_AM_INTERESTED_IN

但是,这可能不完全您想要的!这可能在大多数情况下都有效,但在 feature/BRANCH_I_AM_INTERESTED_IN 上的某些更改也已驻留在 master 上的情况下不起作用。例如,也许您的功能分支上的错误修复非常重要,以至于必须 cherry-picked 到 master 才能尽快制作生产修补程序。因此,您在 PR 上下文中看到的幕后差异可能不同于明显的 3 点语法差异。由于 PR 工具(GitHub、GitLab、AzureDevops、BitBucket 等)独立于 Git 本身,因此您看到的差异甚至可能因您使用的工具而异使用!

重要提示: 在 diff 命令中使用分支名称,特别是 master,仅在 before PR 是完全的。如果你想在 PR 完成后使用相同的命令,你需要将 master 更改为 master 在完成之前指向的提交。

话虽这么说,幸运的是,就您问题的上下文而言,一旦 PR 完成,确实 straight-forward 可以看到 PR 的确切变化是什么在没有 diff 命令的情况下引入。 (请注意,这确实表明,如果您比较 after PR 完成的差异,这与 PR 工具向您显示的 before 不同完成,然后 PR 工具实际上是“错误的”,或者至少是“误导的”,不幸的是,这种情况很常见!)

要查看 PR 带来了哪些更改,您只需将 PR 的合并提交与 first-parent 进行比较。通常你可以用 2 点差异来做到这一点:

git diff <commit-id-of-PR-merge-commit>~1..<commit-id-of-PR-merge-commit>

(请注意,您应该将父提交放在 diff 命令中的第一位,以便您从正确的 POV 中看到它。如果您翻转它们,新文件将显示为删除等)

现在,如果您没有 PR 的合并提交怎么办?如果要合并的分支已经是最新的 master,并且允许 fast-forward 合并意味着没有创建合并提交,则会发生这种情况。在那种情况下,它有点棘手,因为您必须知道提交 master 在该 PR 完成之前已经开始。我希望您使用的任何 PR 工具都能够在历史背景下提供该信息,以便您可以比较 master 上代表 PR 完成前后的两次提交。