我有一个包含功能1,功能2和一些修复的开发分支。出于另一个开发原因,我们想要从开发创建另一个分支,并且只需要该分支中的修复,而不需要特征1和特征2.因此,我从开发创建分支并恢复特征1和特征2的提交。现在我们在那个新分支中做了一些开发。现在我想将这个分支与develop分支合并。但是我们需要开发分支中的功能1和2。但是如果我们合并,那么功能1和2提交将从开发中删除。
那么在git中解决它的最佳方法是什么。一种方法是获取功能1和2的更改,并将其作为补丁应用于合并的开发分支。但问题是这两个功能有几处变化。
答案 0 :(得分:2)
在下面的答案中,我假设当你从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
您希望在D
之上E
提交newbranch
和develop
次提交,而忽略那些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
与HEAD
develop
重合,我们只是要求Git重播提交D
和E
,按顺序重播提交develop
。
如果您想要对Git的rebase --onto
进行出色的解释,我建议您阅读@Enrico给出的答案: