更改Git父分支

3

假设我们有一个分支结构,类似于:

develop   -> --- a --- b --- c
                  \           \
feature 1 ->       \           --- d --- e
                    \    
feature 2 ->         --- f --- g

在完成特性1的工作后,我意识到它实际上应该作为特性2的子任务分支出来。
有没有一种方法可以让特性1“撤销”与develop分支的关联,并与特性2分支联系起来,同时保留其提交记录?
示例:
develop   -> --- a --- b --- c    
                  \    
feature 1 ->       \         --- d --- e
                    \       /
feature 2 ->         f --- g

1
在这种情况下,rebase 是行不通的。你可以这样做:git checkout g; git cherry-pick e~2..e - eftshift0
2
一个想法是从 feature2 构建一个名为 feature1b 的分支,然后挑选提交记录 de。删除 feature1 并将 feature1b 重命名为 feature1 - Willem Van Onsem
2个回答

7

最简单的解决方案是使用带有--onto标志的rebase,如在Git书籍中所述。命令:

git rebase --onto feature2 develop feature1

将没有在develop上找到的来自feature1的提交,在feature2之上重新定位。

0
通常情况下,您会查看git rebase来处理这种情况,但是它不起作用,因为从feature1到feature2的变基将包括提交b和c,而您不想要它们。
Willem建议使用cherry-pick可能是正确的方法。
创建一个新分支:
git checkout -b feature1b feature1

挑选感兴趣的提交记录(这里我说的是“feature1的最后两个提交记录”,但你也可以使用实际的提交记录ID等来指定提交记录范围):

git cherry-pick feature1~2..feature1

此时,分支feature1b与您所需的历史记录匹配。根据您的需要,您可以执行一些可选的清理操作:

删除旧分支:

git branch -D feature1

重命名新分支:

git branch -m feature1

git rebase --onto feature2 develop feature1 可以一步完成,但我承认这特别令人困惑。 :-) - torek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接