使用Git删除不需要的合并提交和rebase

时间:2014-06-24 10:06:07

标签: git git-merge rebase

我有一个功能分支开发。我开始使用开发而不是合并来修改我的功能分支的做法,因为线性提交历史的好处适合我的项目,该项目有一些上游和下游存储库。

我遇到有人合并的情况会发展到功能分支并进行更多提交然后推送到远程。我希望能够得到我删除合并提交的点,并选择分支上的后续提交。这是因为知道在分支机构工作的其他人必须基本上删除他们的本地人并下拉修改后的人。我在一个小团队工作,这是可以管理的。

执行此操作的最佳方法是选择合并提交的所有提交栏的交互式rebase吗?

所以git rebase -i commit-sha-before-merge

我知道这很可能导致构建中断,因为合并后发生的提交依赖于合并中的代码。我将通过最终使用develop来重新设置我的功能分支来解决这个问题。

1 个答案:

答案 0 :(得分:7)

正如torek指出in the comments,在Git中有不止一种方法可以做到这一点。比如说,你有一个像这样的提交图:

develop *-------*
         \       \
  feature *---*---*---*---*
          X   M^  M   Y^  Y

X是您的功能分支上的第一个提交,M是使用develop进行的合并提交,Y是功能分支上的最后一次提交。

解决方案1:Rebases

这取决于将分支B重新分支到另一个分支A的事实等同于将分支A合并到B 。在这种情况下,我们将使用两个rebase,一个用于在合并提交之前对功能分支提交进行rebase,另一个用于在合并之后重新提交提交: / p>

# Create a temporary branch at the commit right before the merge commit M
git checkout -b temp M^

# Rebase onto the develop branch
git rebase develop

# Now rebase the remaining commits after M onto the temp branch
git rebase --onto temp M feature

这将生成以下提交图

        X   M^  Y^  Y
*---*---*---*---*---*
    ^       ^       ^
 develop   temp  feature

现在您可以使用git branch --delete temp删除临时分支。

解决方案2:Cherry-picks

以下是使用cherry-picks获得相同结果的方法,例如torek suggested

# Temporarily hard reset feature to the develop branch
git checkout feature
git reset --hard develop

# Cherry-pick all commits between X to M^.
# The start of the cherry-pick range is exclusive, i.e. it doesn't include
# the starting point X^.
git cherry-pick X^..M^

# Cherry-pick all commits between M to Y
git cherry-pick M..Y

文档