Git - 查找所有 parents 提交的最旧共同祖先分支点?

Git - Find the oldest common ancestor branch point of all parents of a commit?

给定一个提交 SHA,如何使用管道命令找到所有 parent 中最早的共同祖先?具体来说 - 在每个 parent 分支(其中一个是 master)中,select 最旧的两个(master 和 X),然后找到它们分支的点。

我已经查看了几个类似的问题,例如 Finding a branch point with Git?,但这些问题似乎并没有处理可能有 3 次以上的提交,或者使用 rev-list --first-parent 我认为这并不太明白我想要什么。

到目前为止我想出的最好的是 git merge-base --octopus $(git cat-file -p $(git rev-parse HEAD) | grep parent | awk '{ printf "%s ", }'),但是它得到了 'best' 的祖先,而不是最老的...

示例:

a) 给定 Z,L、F 和 J 谁是 parent,我如何找到 X?

                    K ------- L -------              branch_1
                   /         /         \
                  /         /           \
HISTORY-- X -- A -- B -- C -- D -- F --- Z--->       master
             \     /   \     /          /
              \   /     \   /          /
                G -- H -- I -- J -----/              branch_2

b) 给定 D,谁的 parent 是 C,我,我如何找到 A?

             G --- H -- I           branch_1
            /     /      \
HISTORY--- A -- B -- C -- D ----    master

起初我还以为你指的是章鱼合并式合并基础。

你的意思很清楚(我认为!),但是表达有点棘手。由于 ,简单的描述导致回归到根提交(或声明没有这样的祖先)。

我认为,您想要的是 最新 提交,使得从给定提交向后的 all 路径到达该提交。因此,给定 ZX 或任何更早的提交就足够了,因为 XZ 的每个祖先的祖先,而 ZX 的后代。 A 不合格,因为虽然 AZ 本身的三个祖先的祖先,但它 不是 [=18 的祖先=],而 G Z 的祖先。

找到 X 的方法是对提交图进行拓扑排序的优先级队列遍历,在这种情况下从 Z 的所有父级开始,就像 git log或者 git rev-list 会在给定 --topo-order Z^@ 的情况下执行。当优先队列深度为1时,优先队列头部的提交就是你要查找的提交。

git rev-list 没有选项可以只吐出这个提交哈希。我认为您几乎必须编写自己的代码才能找到它。