为什么 git merge-base 不报告最后一个合并点?
Why doesn't git merge-base report last merge point?
在与 master 的第二次追赶合并期间,我们发现功能分支上发生意外冲突。在调查期间,我使用 git merge-base 期望在分支之间找到最新的合并点,但发现了一个更早的合并点,我怀疑这会导致我们意外的冲突。
问题
- 我们做错了什么才会碰到这个问题?
- 我们可以指定要在合并命令中使用的合并库吗?
- 有人可以解释为什么我们可能会看到一个较早的合并点作为基础吗?
分行主关系的背景故事/历史
- 从 master 创建的功能分支
- master(产品源、系统测试源)的变化
- 功能更改(产品源)
- nov29 catchup merge 从 master 到 feature 导致(product src, systest src)更改应用于 feature
- master(产品源、系统测试源)的变化
- 功能更改(产品源)
- 从 master 到 feature 的 catchup 合并在 systest src 上显示冲突
- 合并基础似乎是 nov15 而不是之前的追赶合并
- git 合并基础主功能导致 nov15 提交而不是 nov29 追赶合并
依次为:
- 我不知道,但线索会在
git log --graph --decorate --oneline --boundary master...feature
的输出中。 --graph
显示图形; master...feature
选择一个分支上的所有提交,而不是两个分支上的所有提交(即删除合并基础); --boundary
放回最先删除的提交(即合并基础); --decorate --oneline
以更好的查看格式呈现图表。
- 不,Git 总是根据图表自行计算合并基础。
- 因为that/those is/are 合并碱基,基于图表。
实际上上面有两个关键项目:图表决定了所有和可能有不止一个合并基础(使用git merge-base --all
以查看 所有 个,当有多个时)。在多个碱基的情况下,-s recursive
默认合并策略使用所有碱基,而 -s resolve
合并策略任意选择一个。通常只有一个,所以这没有什么区别,当 是 多个时,在理想情况下,所有合并基础都会产生相同的结果,因此 -s recursive
等于 "just checking".
背景
从技术上讲,合并基础由 "lowest common ancestor" 或 DAG(有向无环图)的 LCA 定义。 (术语 "lowest" 的出现是因为计算机科学家将他们的树倒过来绘制。)在一个 DAG 中,可能有不止一个同样低的共同祖先,这就是出现多个合并基础的时候;在 Git 中,这只有在有 "criss-cross merges" 的情况下才会发生,而您这样做:
git checkout main; git merge sub
git checkout sub; git merge main
以便两个分支相互合并。
有关 DAG 和 LCA 的更多信息,请参阅 this very drafty draft 的第 2 章。
在与 master 的第二次追赶合并期间,我们发现功能分支上发生意外冲突。在调查期间,我使用 git merge-base 期望在分支之间找到最新的合并点,但发现了一个更早的合并点,我怀疑这会导致我们意外的冲突。
问题
- 我们做错了什么才会碰到这个问题?
- 我们可以指定要在合并命令中使用的合并库吗?
- 有人可以解释为什么我们可能会看到一个较早的合并点作为基础吗?
分行主关系的背景故事/历史
- 从 master 创建的功能分支
- master(产品源、系统测试源)的变化
- 功能更改(产品源)
- nov29 catchup merge 从 master 到 feature 导致(product src, systest src)更改应用于 feature
- master(产品源、系统测试源)的变化
- 功能更改(产品源)
- 从 master 到 feature 的 catchup 合并在 systest src 上显示冲突
- 合并基础似乎是 nov15 而不是之前的追赶合并
- git 合并基础主功能导致 nov15 提交而不是 nov29 追赶合并
依次为:
- 我不知道,但线索会在
git log --graph --decorate --oneline --boundary master...feature
的输出中。--graph
显示图形;master...feature
选择一个分支上的所有提交,而不是两个分支上的所有提交(即删除合并基础);--boundary
放回最先删除的提交(即合并基础);--decorate --oneline
以更好的查看格式呈现图表。 - 不,Git 总是根据图表自行计算合并基础。
- 因为that/those is/are 合并碱基,基于图表。
实际上上面有两个关键项目:图表决定了所有和可能有不止一个合并基础(使用git merge-base --all
以查看 所有 个,当有多个时)。在多个碱基的情况下,-s recursive
默认合并策略使用所有碱基,而 -s resolve
合并策略任意选择一个。通常只有一个,所以这没有什么区别,当 是 多个时,在理想情况下,所有合并基础都会产生相同的结果,因此 -s recursive
等于 "just checking".
背景
从技术上讲,合并基础由 "lowest common ancestor" 或 DAG(有向无环图)的 LCA 定义。 (术语 "lowest" 的出现是因为计算机科学家将他们的树倒过来绘制。)在一个 DAG 中,可能有不止一个同样低的共同祖先,这就是出现多个合并基础的时候;在 Git 中,这只有在有 "criss-cross merges" 的情况下才会发生,而您这样做:
git checkout main; git merge sub
git checkout sub; git merge main
以便两个分支相互合并。
有关 DAG 和 LCA 的更多信息,请参阅 this very drafty draft 的第 2 章。