4

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

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 合并到开发中。我想回到原来的状态

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

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

4

2 回答 2

6

查看 feature-branch-2

git checkout feature-branch-2

并基于从 g 开始的提交(feature-branch-1 的最后一次提交)到开发:

git rebase --onto develop feature-branch-1

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

于 2018-01-20T13:28:55.707 回答
4

你有两种可能性:

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

git reflog feature-branch-2

检索提交的哈希d

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

git reset --hard <hash_of_commit_d>

这个解决方案相当于一个纯粹的“撤消”。您将处于与变基之前完全相同的状态。此外,一个优点是,如果您在变基期间遇到冲突,您将不必以其他方式再次解决它们。

编辑:也在这个答案中描述:https ://stackoverflow.com/a/135614/717372

  • 第二个是做一个rebase --onto(有关详细信息,请参阅@Veger 答案)

如果你在 rebase 之后做了一些新的提交,这个解决方案会更好。但是如果你在最初的 rebase 过程中发生了冲突,你将不得不解决相反的问题。

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

于 2018-01-20T13:57:03.300 回答