为什么git merge-base报告上次合并点?

时间:2016-12-06 16:20:38

标签: git git-merge

我们在第二次追加与主人合并期间看到了一个功能分支上的意外冲突。在调查期间,我使用git merge-base期望找到分支之间的最新合并点,但发现更早,我怀疑这会导致我们意想不到的冲突。

问题

  • 我们做错了什么来解决这个问题?
  • 我们可以指定要在合并命令中使用的合并库吗?
  • 有人可以解释为什么我们可能会将早期的合并点视为基础吗?

分支主人关系的背景故事/历史

  • 从主
  • 创建的功能分支
  • 对master(product src,systest src)的更改
  • 功能更改(产品src)
  • nov29追赶合并从主要功能结果(产品src,systest src)更改应用于功能
  • 对master(product src,systest src)的更改
  • 功能更改(产品src)
  • 从主人到功能的追赶合并在系统src上显示冲突
    • merge base似乎是nov15而不是之前的catchup merge
  • git merge-base master feature in nov15 commit not nov29 catchup merge

1 个答案:

答案 0 :(得分:3)

按顺序:

  1. 我不知道,但线索将出现在git log --graph --decorate --oneline --boundary master...feature的输出中。 --graph显示图表; master...feature选择任一分支上的所有提交但不选择两者(即删除合并基础); --boundary放回第一个被删除的提交(即合并基础);并且--decorate --oneline以更好的查看格式显示图表。
  2. 不,Git总是从图中自行计算合并基础。
  3. 因为/那些是基于图表的合并基础。
  4. 上面实际上有两个关键项:图表指示所有可能有多个合并基础(使用git merge-base --all查看所有,当有多个时)。在多个基数的情况下,-s recursive默认合并策略使用所有这些,而-s resolve合并策略任意选择一个。通常只有一个,所以这没有区别,当 多于一个时,在理想情况下,所有合并基数都会产生相同的结果,因此-s recursive数量“只是检查”。

    背景

    从技术上讲,合并基数由DAG(Directed Acyclic Graph)的“最低共同祖先”或LCA定义。 (术语“最低”的出现是因为计算机科学家将树木颠倒过来。)在DAG中,可能存在多个同样低的共同祖先,这就是多个合并基础出现的时候;在Git中,只有在存在“纵横交错合并”时才会发生这种情况:

    git checkout main; git merge sub
    git checkout sub; git merge main
    

    以便两个分支相互合并。

    有关DAG和LCA的更多信息,请参阅this very drafty draft的第2章。