Git Merge并取消设置恢复的提交

时间:2017-03-24 05:28:18

标签: git

我有一个包含功能1,功能2和一些修复的开发分支。出于另一个开发原因,我们想要从开发创建另一个分支,并且只需要该分支中的修复,而不需要特征1和特征2.因此,我从开发创建分支并恢复特征1和特征2的提交。现在我们在那个新分支中做了一些开发。现在我想将这个分支与develop分支合并。但是我们需要开发分支中的功能1和2。但是如果我们合并,那么功能1和2提交将从开发中删除。

那么在git中解决它的最佳方法是什么。一种方法是获取功能1和2的更改,并将其作为补丁应用于合并的开发分支。但问题是这两个功能有几处变化。

1 个答案:

答案 0 :(得分:2)

在下面的答案中,我假设当你从develop分支时,你做的第一件事就是恢复两个功能提交,然后你完成了你的实际开发工作。如果不是这种情况,我的回答应该仍然有用,不过你可能需要做一些额外的步骤来解决你的情况。

对你的问题来说,概念上最简单的解决办法就是从新分支中选择非恢复提交到develop

git checkout develop
git cherry-pick B^..D

BD替换为要从新分支引入develop的提交的SHA-1提交哈希值。请注意,由于您正在将您的工作重新应用到不同的基础上,因此可能会发生合并冲突。

如果您有更多的冒险精神,也可以尝试使用git rebase --onto。下面的图表说明了新分支和develop的当前状态:

develop   ... ---A---B---C
                  \
newbranch          R1---R2---D---E

您希望在D之上E提交newbranchdevelop次提交,而忽略那些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。由于CHEAD develop重合,我们只是要求Git重播提交DE,按顺序重播提交develop

如果您想要对Git的rebase --onto进行出色的解释,我建议您阅读@Enrico给出的答案:

I can't understand the behaviour of git rebase --onto