撤消重新定位功能分支到另一个功能分支

时间:2018-01-20 13:24:45

标签: git git-rebase feature-branch

我正在开发分支和两个不同的(本地)功能分支。

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

我通过运行

将来自feature-branch-1的更改合并到feature-branch-2中
git checkout feature-branch-2
git rebase feature-branch-1

如果我理解正确,现在看起来像这样:

a -- b -- e                  <-- develop
          |\
          | f -- g           <-- feature-branch-1
           \
            f -- g -- c -- d <-- feature-branch-2

然而,我意识到我在分支1中引入了一个我不知道如何修复的错误。所以这个错误现在也在分支2中,并阻止我将feature-branch-2合并到develop中。我想回到原来的状态

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

这样我就可以安全地将feature-branch-2合并到develop中。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:6)

查看feature-branch-2

git checkout feature-branch-2

并且从g(最后一次提交feature-branch-1)开始提交到develop:

git rebase --onto develop feature-branch-1

请注意,feature-branch-2将基于e而不是b,但我认为这不重要?如果是:请在develop命令中将b替换为git rebase

答案 1 :(得分:4)

您有两种可能性:

  • 第一个也是更简单的方法是查看reflog:

git reflog feature-branch-2

检索提交d的哈希值。

然后通过执行重置来撤消(如果您有未经修改的更改,则在运行此命令之前存储):

git reset --hard <hash_of_commit_d>

此解决方案相当于纯粹的&#34;撤消&#34;。你将处于与rebase之前完全相同的状态。此外,一个优点是,如果你在rebase期间遇到冲突,你将不会再以另一种方式再次解决它们。

编辑:此答案中也有描述:https://stackoverflow.com/a/135614/717372

  • 第二个是rebase --onto(详见@Veger答案)

如果你在rebase之后做了一些新的提交,这个解决方案会更好。但如果你在原始的rebase期间遇到冲突,你将不得不解决相反的问题。

在这种情况下,也许一个很好的解决方案是为原始提交{strong>执行reset而仅为添加的提交执行rebase --onto(您必须创建一个临时分支实现那个)