压缩提交对可合并性有影响吗?

Does squashing commits have an impact on mergability?

我正在 Git 中阅读有关压缩提交的优缺点,然后再制作拉取请求。我没有找到的信息是,如果其他拉取请求被合并到 master 而有问题的拉取请求被推迟,那么带有压缩提交的拉取请求是否或多或少可能变成合并冲突。我可以想象不同的场景:

哪一个是真的,还是事情更复杂? (比如,取决于变化的种类?)

我至少可以想到一个实例,其中压缩提交 较少 可能导致冲突:

假设您的分支中有三个两个提交,ABAB 的祖先。

对于 A,它更改文件顶部附近的五行和底部附近的五行。 BA 的第一个大块相反,将文件的该部分更改回 A~1.

中的内容

A + B 的总变化是文件底部附近的五行变化。

如果有人在文件顶部的五行附近更改某些内容,则分支在合并时会发生冲突。

如果您将 AB 合并到一个新的提交中 C,就不会发生冲突。

如果您担心 运行ning git merge,请注意 git merge 定位了三个提交:

  • 您当前的提交,总是可以通过名称 HEAD;
  • 立即找到
  • 你的合并目标 --theirs / 其他 / "remote" 提交,这是你在 运行 git merge otherbranch 时命名的;和
  • 合并基础,Git 使用提交图定位。

我喜欢将这三个提交称为L(对于Left/Local/--ours),R( Right/Remote/--theiRs);和 B(对于基础)。

如果你正在压缩 "sensibly"(抱歉,这个定义不明确!),这对合并基础查找没有影响。 LB 是一样的。唯一的影响是 R 将具有不同的哈希 ID。 Rtree(保存的源快照)将是相同的,无论您是否已压扁。

git merge 有效地做:

git diff --find-renames B L > /tmp/ours.patch
git diff --find-renames B R > /tmp/theirs.patch

然后组合补丁,以便将组合集应用于提交 B 中的树。由于这三棵树将保持不变,所以压缩对合并没有任何影响。