在下面的答案中,我假设当您从 develop 分支时,您所做的第一件事是还原两个功能提交,然后您进行实际的开发工作。如果不是这种情况,我的回答应该仍然有帮助,尽管您可能需要执行一些额外的步骤来解决您的情况。
也许概念上最简单的问题解决方案是从新分支中挑选非还原提交到develop:
git checkout develop
git cherry-pick B^..D
将B 和D 替换为您要从新分支引入develop 的提交的SHA-1 提交哈希。请注意,您可能会因此遇到合并冲突,因为您正在将您的工作重新应用到不同的基础上。
如果您喜欢冒险,也可以尝试使用git rebase --onto。这是一个图表,说明了您的新分支的当前状态和develop:
develop ... ---A---B---C
\
newbranch R1---R2---D---E
并且您想在develop 之上播放来自newbranch 的D 和E 提交,而忽略那些R1 和R2 还原提交。换句话说,你想要这样结束:
develop ... ---A---B---C---D'---E'
\
newbranch R1---R2---D---E
您可以使用以下命令来实现:
git checkout develop
git rebase --onto C R2 E
onto 命令表示以C 为基础,并重播所有父级为R2(但不包括R2 本身)的提交,直至并包括提交E。由于C 与develop 的HEAD 重合,我们只是要求Git 重播D 和E 的提交,按照develop 顶端的顺序。
如果你想对 Git 的rebase --onto 有一个很好的解释,我建议在这里阅读@Enrico 给出的答案:
I can't understand the behaviour of git rebase --onto