Git-在一次提交的所有父母中找到最老的共同祖先分支点?

时间:2018-07-25 19:37:43

标签: git branch

给定一个SHA,一个人如何使用管道命令找到所有父母中最老的共同祖先?具体来说,-在每个父分支(其中一个是主分支)中,选择最早的两个(主分支和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 ",$2 }'),但这是“最好的”祖先,而不是最老的祖先……

示例:

a)假设Z的父母是L,F和J,我怎么找到X?

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

b)鉴于D,父母是C,我如何找到A?

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

1 个答案:

答案 0 :(得分:2)

起初我还以为你是指章鱼合并风格的合并库。

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

我想,您想要的是最新提交,以使 all 从给定提交返回的所有路径都到达该提交。因此,给定ZX或任何更早的提交就足够了,因为XZ的每个祖先的祖先,而XA的后代。 A不符合条件,因为尽管ZG本身的三个祖先的祖先,但它不是G的祖先,而Z X的祖先。

找到Z的方法是对提交图进行拓扑排序的优先级队列遍历,在这种情况下,从git log的所有父级开始,就像git rev-list或{给定--topo-order Z^@,{1}}就可以了。当优先级队列的深度为1时,优先级队列顶部的提交就是您要搜索的提交。

git rev-list不能仅吐出该提交哈希值。我想,您几乎必须编写自己的代码才能找到它。