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

Undo rebasing feature branch onto another 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

git checkout feature-branch-2

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

git rebase --onto develop feature-branch-1

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

你有两种可能:

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

git reflog feature-branch-2

检索提交的哈希 d

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

git reset --hard <hash_of_commit_d>

这个解决方案等同于一个纯粹的"undo"。您将处于与变基之前完全相同的状态。另外,一个好处是,如果你在变基过程中遇到冲突,你就不必用其他方式再次解决它们。

编辑:此答案中也有描述:

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

如果你在变基后做了一些新的提交,这个解决方案会更好。但是如果你在原来的 rebase 过程中有冲突,你将不得不解决相反的问题。

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