【问题标题】:How can I have merge conflicts between 2 branches with common ancestor?如何在具有共同祖先的 2 个分支之间发生合并冲突?
【发布时间】:2018-01-24 18:31:17
【问题描述】:

我们最近在尝试合并两个分支时遇到了一个非常奇怪的问题。情况归结为以下几点:

  1. branch A 是一些长期存在的分支,我们希望合并回主干线 B,它还有一些其他提交
  2. 我们希望将B 合并到A,然后将A 合并回B
  3. 在执行git checkout A; git merge B 时,我们会遇到与A 引入的更改无关的合并冲突:它们位于一堆文件中,据称A 未触及但在B 中更改
  4. 使用git annotategit log 来跟踪其中一个冲突文件的祖先,我们有效地注意到冲突位置具有共同的提交祖先1234:在A 中,一行用1234 注释,并且5678B 中,但 git annotate file1 5678^ 显示 1234 用于冲突行。

我不明白这怎么可能,也找不到任何关于类似问题的线索。

【问题讨论】:

  • git blame aka git annotate 必须线性化不可线性化,而git merge(和git merge-base --all)查看实际图形,所以看看@ 987654344@ 产生作为其提交哈希 ID 或 ID。
  • 感谢您的提示 :) !我应该说,由此产​​生的提交以及它的历史都没有什么令人惊讶的。
  • 好的 - 好吧,我需要查看更多内容才能了解您为什么会遇到合并冲突。但是你可以通过git diff --find-renames <base> Agit diff --find-renames <base> B 来查看what Git 在声明此冲突时看到的内容。 为什么(就提交而言)更棘手。
  • 是的,我知道没有很多细节很难。当然,我不能为闭源软件提供这些。感谢您为提供有意义的答案所做的努力。

标签: git merge version-control


【解决方案1】:

在与分支B 的共同祖先之后,应在分支A 上更改冲突文件。您可以再次通过git annotategit log 仔细检查。

1。分别列出在分支 A 和分支 B 中修改冲突文件的提交:

git annotate filename A
git annotate filename B

注意:git annotate 中的提交列表按从旧(顶部)到新(底部)的顺序排列。

假设命令的输出如下:

$ git annotate filename A
commit A1
commit A2
commit common
commit A3
commit A4

$ git annotate filename B
commit B1
commit B2
commit B3
commit common
commit B4

这意味着,在提交祖先commit common 之后,冲突文件在提交A3 和提交A4 中的分支A 中发生了更改;在分支B,冲突文件是在那之后commit B4的变化。

2。将 git 日志显示为更改所有分支中冲突文件的提交的图表

您可以使用以下命令通过图形显示更改冲突文件的提交:

git log --oneline --decorate --graph --all -- filename

那么图表将如下所示:

* commit A4 (branch A)
* commit A3
|   * commit B4 (branch B)
*   | commit Common
|  \
*   | commit A2
*   | commit A1
|   * commit B3
|   * commit B2
|   * commit B1
|   |
…   …

【讨论】:

  • 感谢您在git log 中使用--all 的提示。似乎这没有显示合并提交,我认为问题是由未正确处理的合并提交引入的。
  • @insitu:更重要的是,如果您使用的是git log ... -- filename,请注意这会开启 Git 所谓的 History Simplification。要消除简化的影响,您可以将--full-history 添加到git log 选项中。此外,git log 通常不会非常仔细地查看合并提交;您可以将-m 添加到选项中,使其将合并提交拆分为多个单独的虚拟提交,这有助于追踪错误合并。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2023-03-20
  • 2012-08-23
  • 1970-01-01
  • 2023-02-24
  • 2013-06-16
相关资源
最近更新 更多