【问题标题】:Undo rebasing feature branch onto another feature branch撤消 rebase 特性分支到另一个特性分支
【发布时间】:2018-06-29 14:42:13
【问题描述】:

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

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 合并到开发中。我怎样才能做到这一点?

【问题讨论】:

  • 您可以尝试从develop 创建一个新的空分支并使用git cherry-pick 只接受cd 的提交。
  • 只有两个提交 cd 值得保留,这是可以接受的。如果我在一个长期运行的特性分支上工作,单独选择提交是不可接受的。不过,我感谢您的帮助!

标签: git git-rebase feature-branch


【解决方案1】:

查看 feature-branch-2

git checkout feature-branch-2

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

git rebase --onto develop feature-branch-1

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

【讨论】:

  • 不应该是git rebase --onto b g吗?
  • @Code-Apprentice 是的,你是对的(奇怪的是我一直在使用它,但从今天开始就像你说的那样......:o 我使用的 git 版本中的一些错误? ?) 感谢您的指出!
  • 您的答案中的命令“有效”,但产生的结果与 OP 要求的不同。在许多项目中,rebase 到 devel 分支是常见的做法。
【解决方案2】:

你有两种可能性:

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

git reflog feature-branch-2

检索提交d的哈希。

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

git reset --hard &lt;hash_of_commit_d&gt;

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

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

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

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

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

【讨论】:

  • 如果我在d 之后的分支 2 中有更多提交,那不会删除它们吗?假设我将分支 1 合并到分支 2 中,因此以 f-g-c-d 结束,然后在我意识到分支 1 中的错误之前继续在分支 2 中提交 h-i-j。按照您的方法,我最终不会得到 @987654331 @ 再次?如果我只想从分支 1 中删除提交,以便在分支 2 中得到 c-d-h-i-j 怎么办?
  • 我的解决方案严格撤消了您所做的变基。优点是您不能引入回归(特别是如果在变基期间解决了冲突)。要按您的要求做,您必须执行@Veger 的解决方案中描述的rebase --onto
猜你喜欢
  • 2021-08-20
  • 2015-06-29
  • 2018-06-22
  • 2017-02-21
  • 2021-06-28
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
相关资源
最近更新 更多