撤销将特性分支变基到另一个特性分支的功能

5

我正在开发分支上工作,并且有两个不同的(本地)功能分支。

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 分支中。我应该如何实现这一目标呢?


1
你可以尝试从develop创建一个新的空分支,然后使用git cherry-pick仅获取提交cd - Dane Hillard
只有两个值得保留的提交 cd,这是可以接受的。如果我正在开发一个长期运行的功能分支,逐个挑选提交将不可接受。不过还是感谢您的帮助! - David
2个回答

7
请查看功能分支2.
git checkout feature-branch-2

并在 develop 分支上以 g 为起点,将 feature-branch-1 的最后一个提交重新应用。

git rebase --onto develop feature-branch-1

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

1
应该是 git rebase --onto b g 吧? - Code-Apprentice
@Code-Apprentice 是的,你说得对(奇怪的是我一直在按照我写的方式使用它,但自从今天起就像你所说的那样... :o 我使用的git版本有点问题吗?)感谢指出! - Veger
你的回答中的命令“有效”,但产生的结果与原帖所要求的不同。在许多项目中,将代码重新基于开发分支是常见的做法。 - Code-Apprentice

4
您有两种选择:
第一种更简单的方法是查看reflog:
git reflog feature-branch-2
以检索提交d的哈希值。
然后通过执行重置来撤消(如果有未提交的更改,请在运行此命令之前进行stash):
git reset --hard 此解决方案等同于纯“撤消”。您将处于与重新基础之前完全相同的状态。另外,一个优点是,如果您在重新基础期间遇到冲突,则不必再次在另一种方式中解决它们。
编辑:还在这个答案中描述:https://dev59.com/WnVC5IYBdhLWcg3w9GLM#135614 第二种方法是执行rebase --onto(有关详细信息,请参见@Veger的答案)
如果您在重新基础后进行了一些新的提交,则此解决方案更好。但是,如果您在原始重新基础期间遇到冲突,则必须解决相反的冲突。
也许在这种情况下,一个好的解决方案是对原始提交进行重置,并仅对添加的提交执行rebase --onto(您需要创建一个临时分支来实现这一点)。

1
如果在“d”之后在分支2中有更多的提交,那么这不会删除它们吗?假设我将分支1合并到分支2中,因此最终得到了“f-g-c-d”,然后在意识到分支1中的错误之前继续在分支2中提交“h-i-j”。使用您的方法,我不会再次获得“c-d”吗?如果我只想从分支1中删除提交,以便我最终在分支2中得到“c-d-h-i-j”,该怎么办? - David
1
我的解决方案严格撤销了您所做的变基。优点是您不会引入回归(特别是如果在变基期间解决了冲突)。要执行您要求我的操作,您必须执行@Veger解决方案中描述的“rebase --onto”命令。 - Philippe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接