Github 如何产生小的分支差异?

How does Github generate small branch diffs?

假设我按以下顺序处理一个项目:

  1. fork master 到名为 BRANCH-A 的分支
  2. 将 BRANCH-B 合并到 master
  3. 将 BRANCH-C 合并到 master
  4. 在 BRANCH-A 上做一些工作并提交拉取请求

现在,如果我在本地检出 BRANCH-A 并且 运行 git diff master,差异将包括来自 BRANCH-B 和 BRANCH-C 的文件,它们在 master 中但不在我的分支中。

但是,如果我在 Github 上检查相同的差异,它会在生成更改文件列表和视觉差异时排除来自 BRANCH-B 和 BRANCH-C 的更改。

Github 如何生成此差异?如何在命令行重现它?

您可以在分支 [1] 的分支点和分支 by separating both names with three dots 的当前头部之间创建差异:git diff master...a

比较:

[timwolla@/t/test (a)]git diff master..a
diff --git a/a b/a
new file mode 100644
index 0000000..e69de29
diff --git a/a2 b/a2
new file mode 100644
index 0000000..e69de29
diff --git a/b b/b
deleted file mode 100644
index e69de29..0000000
diff --git a/c b/c
deleted file mode 100644
index e69de29..0000000

[timwolla@/t/test (a)]git diff master...a
diff --git a/a b/a
new file mode 100644
index 0000000..e69de29
diff --git a/a2 b/a2
new file mode 100644
index 0000000..e69de29

[1] 它是“最新的”共同祖先,可以通过以下方式检索:git merge-base master a。您也可以使用 git diff $(git merge-base master a) 来达到与三个点相同的效果。