gpt4 book ai didi

git - 如何对一系列分支进行 rebase ?

转载 作者:太空狗 更新时间:2023-10-29 14:47:20 25 4
gpt4 key购买 nike

假设我们有以下修订图:

A-B (master)
\
C (feature-a)
\
D (feature-b) [depends on feature a]
\
E (feature-c) [depends on feature b]

然后修改 master 以跟随提交 F是否有任何简单的方法将 E rebase 到 F (master) 以便分支 feature-a, feature-b feature-c 都是这样结束的:

A-B-F (master)
\
C' (feature-a)
\
D' (feature-b)
\
E' (feature-c)

?

在现实世界的情况下,每个功能之间显然有多个补丁,因此手动重新附加分支到 rebase 历史是一项乏味且容易出错的工作。我知道我可以使用简单的 git checkout feature-c && git rebase masterE rebase 为 E' 但这会留下分支 feature-afeature-b 指向提交 CD 而不是 C'D'。 Rebase 应该拥有移动所有分支的所有信息,对吗?

最佳答案

git 中没有内置任何东西来执行此操作,但它肯定是可编写脚本的。

你需要做的是:

  • 确定要 rebase 的分支(此处为 feature-afeature-bfeature-c)。
  • 对于每个分支,确定哪些要重新设置基础的分支“包含”它们(我们称其为“前身”)。分支 XY 的前身,如果 YX 的后代(并在此处选择要处理的内容/break-ties-with 两个分支名称标识相同的提交)。在这种情况下,feature-afeature-bfeature-c 的前身,而 feature-bfeature-c 的前身(仅)。保存前驱的“distance back”值(追父链多远)。
  • 执行拓扑排序。 (实际上,您可以作弊并只找到叶子。如果您通过观察提交 DAG 以外的其他方法选择分支名称,则只需要循环检查。)
  • 对于每片叶子(在本例中只是feature-c):
    • 对其进行 rebase 。
    • 对于这个叶子的每个前任,将它从现在的任何地方移动到新叶子尖端的 N-parents-back。

(就是这样,全部完成。)

使用 git merge-base --is-ancestor(成对)或 git branch --contains(整体,但需要过滤掉非重新设置分支机构)。找到“N back”值有点棘手,但我相信可以通过将 git rev-list 传送到 wc -l 来完成,例如。

编辑:我看到链接的答案(在上面的评论中)使用了类似的算法——包括拓扑排序/周期性检查,这是必需的,因为分支选择方法不是“从提交 DAG 中获取”——但需要更多的工作,按照指示明确地重新定位每个分支。如果您从 DAG 开始工作,叶子 rebase 已完成所有工作,并且可以简单地重新标记前任,正如我所指出的。

关于git - 如何对一系列分支进行 rebase ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19860484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com