给定一个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
答案 0 :(得分:2)
起初我还以为你是指章鱼合并风格的合并库。
(我认为!)你的意思很清楚,但是表达有点棘手。与Mark Adelsberger notes in a comment一样,简单的描述导致回归到根提交(或声明没有这样的祖先)。
我想,您想要的是最新提交,以使 all 从给定提交返回的所有路径都到达该提交。因此,给定Z
,X
或任何更早的提交就足够了,因为X
是Z
的每个祖先的祖先,而X
是A
的后代。 A
不符合条件,因为尽管Z
是G
本身的三个祖先的祖先,但它不是G
的祖先,而Z
是X
的祖先。
找到Z
的方法是对提交图进行拓扑排序的优先级队列遍历,在这种情况下,从git log
的所有父级开始,就像git rev-list
或{给定--topo-order Z^@
,{1}}就可以了。当优先级队列的深度为1时,优先级队列顶部的提交就是您要搜索的提交。
git rev-list
不能仅吐出该提交哈希值。我想,您几乎必须编写自己的代码才能找到它。