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 路径到达该提交。因此,给定 Z
、X
或任何更早的提交就足够了,因为 X
是 Z
的每个祖先的祖先,而 Z
是 X
的后代。 A
不合格,因为虽然 A
是 Z
本身的三个祖先的祖先,但它 不是 [=18 的祖先=],而 G
是 Z
的祖先。
找到 X
的方法是对提交图进行拓扑排序的优先级队列遍历,在这种情况下从 Z
的所有父级开始,就像 git log
或者 git rev-list
会在给定 --topo-order Z^@
的情况下执行。当优先队列深度为1时,优先队列头部的提交就是你要查找的提交。
git rev-list
没有选项可以只吐出这个提交哈希。我认为您几乎必须编写自己的代码才能找到它。
给定一个提交 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 路径到达该提交。因此,给定 Z
、X
或任何更早的提交就足够了,因为 X
是 Z
的每个祖先的祖先,而 Z
是 X
的后代。 A
不合格,因为虽然 A
是 Z
本身的三个祖先的祖先,但它 不是 [=18 的祖先=],而 G
是 Z
的祖先。
找到 X
的方法是对提交图进行拓扑排序的优先级队列遍历,在这种情况下从 Z
的所有父级开始,就像 git log
或者 git rev-list
会在给定 --topo-order Z^@
的情况下执行。当优先队列深度为1时,优先队列头部的提交就是你要查找的提交。
git rev-list
没有选项可以只吐出这个提交哈希。我认为您几乎必须编写自己的代码才能找到它。