GitHub 是如何产生这种差异的?

How does GitHub produce this diff?

这是有问题的差异。这是一个 Pull Request 的 2/3 提交的视图: https://github.com/codeapprove/meta/pull/15/files/5b7549cd97845c41019478f8f339a90c0256014f..7327dfcfb3a95b31f8bf4845556196abe33fefc8

GitHub 显示差异如下:

然而,如果我在命令行上做一个简单的 git diff,我会得到其他东西:

git diff 5b7549cd97845c41019478f8f339a90c0256014f..7327dfcfb3a95b31f8bf4845556196abe33fefc8
diff --git a/index.js b/index.js
index 5f87902..1885a31 100644
--- a/index.js
+++ b/index.js
@@ -5,6 +5,10 @@ function main(args) {
   console.info(args);
 }

+function qooBoz() {
+  console.log("qooBoz");
+}
+
 function fooBar(x, y) {
   const z = x + y;
   return z;
@@ -16,6 +20,7 @@ function barBaz(q, z) {
 }

 function bizBom(a, b) {
+  console.log("bizBom");
   const c = a + b;
   return c;
 }

区别在于GitHub似乎“忽略”了合并提交,只关注 PR 作者所做的更改。在大多数情况下,这是相关的差异,也是我希望看到的。

如何在命令行中获得相同的差异,只知道两个提交哈希 5b7549cd97845c41019478f8f339a90c0256014f7327dfcfb3a95b31f8bf4845556196abe33fefc8


编辑 1

我认为更清晰的提问方式是:GitHub 在这两个链接上所做的 git 操作有何区别:

https://github.com/codeapprove/meta/pull/15/files/5b7549cd97845c41019478f8f339a90c0256014f..7327dfcfb3a95b31f8bf4845556196abe33fefc8

https://github.com/codeapprove/meta/compare/5b7549cd97845c41019478f8f339a90c0256014f..7327dfcfb3a95b31f8bf4845556196abe33fefc8

当您查看图表时,这会变得更加清晰:

$ git log --graph --oneline
* 7327dfc (HEAD -> add-biz-bom, origin/add-biz- bom) Add logging
*   fab1ea5 Merge branch 'main' into add-biz-bom
|\
| * 0d8e5b1 (origin/main, origin/HEAD, main) Add qooBoz function
* | 5b7549c Add bizBom function
|/
* 2e178d9 Add more to index.js
* a9fdc92 Update index.js
...

GitHub“忽略”合并提交 (fab1ea5) 的原因是:

  1. 合并提交本身没有变化(这是典型的)。
  2. 合并带来的提交是0d8e5b1已经在main,所以从这个PR的角度来看,提交不会被添加到main时公关完成。

您链接到的视图仅存在差异 2 次提交;一个是没有更改的合并提交,另一个是提交 7327dfcf,它本身只是添加了您在屏幕截图中看到的一行控制台日志。如果你想从命令行看到它,你可以使用:

git diff fab1ea5..7327dfc

或者如果您“不知道”合并提交的提交 ID 是什么,您可以使用:

git diff 7327dfc~1..7327dfc

旁注:如果您有兴趣在本 PR 的上下文中查看所有 3 次提交的差异 ,以模仿您可以使用的那组更改:

git diff 0d8e5b1...7327dfc

或者更直观地说:

git diff origin/main...origin/add-biz-bom

请注意,对于上述大多数命令,您可以使用 2 个点 (..) 或 3 个点 (...),在这种情况下您会得到相同的答案。但是对于在 PR 上下文中使用分支名称的最后一个,你应该始终使用 3 个点,因为 origin/main 可能在你的 PR 的 merge-base 之前。有关 2 和 3 点之间差异的快速作弊,请参阅 this answer sheet。

警告: 甚至两个分支的最后一个 diff 命令也是 over-simplification。如果对 PR 的源分支和目标分支都添加了一些更改(例如,由于 cherry-picking 或不同人员的重复工作),那么实际差异 在 PR 可能是最后一条命令输出的子集。