压缩提交对可合并性有影响吗?
Does squashing commits have an impact on mergability?
我正在 Git 中阅读有关压缩提交的优缺点,然后再制作拉取请求。我没有找到的信息是,如果其他拉取请求被合并到 master 而有问题的拉取请求被推迟,那么带有压缩提交的拉取请求是否或多或少可能变成合并冲突。我可以想象不同的场景:
- 对于很多小的提交,合并工具可以更容易地判断事物是如何归属在一起的,并且不太可能发生合并冲突。一个“合并冲突”可以“化解”成更小的单元,不冲突,一个一个考虑。
- 对于大量小提交,合并工具可以认为中间提交已经不可合并,即使稍后的提交会修复它。 (感觉有点奇怪。)
- 从技术上讲,这没有任何区别,因为合并工具无论如何只会查看最后一次提交。
哪一个是真的,还是事情更复杂? (比如,取决于变化的种类?)
我至少可以想到一个实例,其中压缩提交 较少 可能导致冲突:
假设您的分支中有三个两个提交,A
和 B
,A
是 B
的祖先。
对于 A
,它更改文件顶部附近的五行和底部附近的五行。 B
与 A
的第一个大块相反,将文件的该部分更改回 A~1
.
中的内容
A
+ B
的总变化是文件底部附近的五行变化。
如果有人在文件顶部的五行附近更改某些内容,则分支在合并时会发生冲突。
如果您将 A
和 B
合并到一个新的提交中 C
,就不会发生冲突。
如果您担心 运行ning git merge
,请注意 git merge
定位了三个提交:
- 您当前的提交,总是可以通过名称
HEAD
; 立即找到
- 你的合并目标
--theirs
/ 其他 / "remote" 提交,这是你在 运行 git merge otherbranch
时命名的;和
- 合并基础,Git 使用提交图定位。
我喜欢将这三个提交称为L(对于Left/Local/--ours
),R( Right/Remote/--theiRs
);和 B(对于基础)。
如果你正在压缩 "sensibly"(抱歉,这个定义不明确!),这对合并基础查找没有影响。 L 和 B 是一样的。唯一的影响是 R 将具有不同的哈希 ID。 R 的 tree(保存的源快照)将是相同的,无论您是否已压扁。
git merge
有效地做:
git diff --find-renames B L > /tmp/ours.patch
git diff --find-renames B R > /tmp/theirs.patch
然后组合补丁,以便将组合集应用于提交 B 中的树。由于这三棵树将保持不变,所以压缩对合并没有任何影响。
我正在 Git 中阅读有关压缩提交的优缺点,然后再制作拉取请求。我没有找到的信息是,如果其他拉取请求被合并到 master 而有问题的拉取请求被推迟,那么带有压缩提交的拉取请求是否或多或少可能变成合并冲突。我可以想象不同的场景:
- 对于很多小的提交,合并工具可以更容易地判断事物是如何归属在一起的,并且不太可能发生合并冲突。一个“合并冲突”可以“化解”成更小的单元,不冲突,一个一个考虑。
- 对于大量小提交,合并工具可以认为中间提交已经不可合并,即使稍后的提交会修复它。 (感觉有点奇怪。)
- 从技术上讲,这没有任何区别,因为合并工具无论如何只会查看最后一次提交。
哪一个是真的,还是事情更复杂? (比如,取决于变化的种类?)
我至少可以想到一个实例,其中压缩提交 较少 可能导致冲突:
假设您的分支中有三个两个提交,A
和 B
,A
是 B
的祖先。
对于 A
,它更改文件顶部附近的五行和底部附近的五行。 B
与 A
的第一个大块相反,将文件的该部分更改回 A~1
.
A
+ B
的总变化是文件底部附近的五行变化。
如果有人在文件顶部的五行附近更改某些内容,则分支在合并时会发生冲突。
如果您将 A
和 B
合并到一个新的提交中 C
,就不会发生冲突。
如果您担心 运行ning git merge
,请注意 git merge
定位了三个提交:
- 您当前的提交,总是可以通过名称
HEAD
; 立即找到
- 你的合并目标
--theirs
/ 其他 / "remote" 提交,这是你在 运行git merge otherbranch
时命名的;和 - 合并基础,Git 使用提交图定位。
我喜欢将这三个提交称为L(对于Left/Local/--ours
),R( Right/Remote/--theiRs
);和 B(对于基础)。
如果你正在压缩 "sensibly"(抱歉,这个定义不明确!),这对合并基础查找没有影响。 L 和 B 是一样的。唯一的影响是 R 将具有不同的哈希 ID。 R 的 tree(保存的源快照)将是相同的,无论您是否已压扁。
git merge
有效地做:
git diff --find-renames B L > /tmp/ours.patch
git diff --find-renames B R > /tmp/theirs.patch
然后组合补丁,以便将组合集应用于提交 B 中的树。由于这三棵树将保持不变,所以压缩对合并没有任何影响。