- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设我们有以下修订图:
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 master
将 E
rebase 为 E'
但这会留下分支 feature-a
和 feature-b
指向提交 C
和 D
而不是 C'
和D'
。 Rebase 应该拥有移动所有分支的所有信息,对吗?
最佳答案
git 中没有内置任何东西来执行此操作,但它肯定是可编写脚本的。
你需要做的是:
feature-a
、feature-b
和 feature-c
)。X
是 Y
的前身,如果 Y
是 X
的后代(并在此处选择要处理的内容/break-ties-with 两个分支名称标识相同的提交)。在这种情况下,feature-a
是 feature-b
和 feature-c
的前身,而 feature-b
是 feature-c
的前身(仅)。保存前驱的“distance back”值(追父链多远)。feature-c
):
(就是这样,全部完成。)
使用 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/
我是一名优秀的程序员,十分优秀!