【问题标题】:How to rebase over already rebased branch如何在已经变基的分支上变基
【发布时间】:2014-12-12 14:27:13
【问题描述】:

我的 git 分支如下所示:

master-*-*-*-*-*-*-implement_x
 \                    \-*-further_foo_fixes_that_depend_on_x
  \                    \-*-*-further_bar_fixes_that_depend_on_x
   \
    \-implement_x_rebased

它以这种方式结束,因为我认为我的分支 implement_x 将按原样合并到上游,但我被要求将其压缩为单个提交,因此 implement_x_rebased。但是,我已经启动了几个分支,用于进一步修复和开发取决于我的工作,同时等待 implement_x 合并。

现在我想在implement_x_rebased 基础上进行进一步的工作。我认为这是一个空操作,因为 implement_ximplement_x_rebased 处于完全相同的状态 - 不会有合并冲突,只需在 @987654330 之上应用 implement_xfurther_foo_fixes_that_depend_on_x 等之间的更改@。然而,似乎 git 并不那么聪明,它试图从基础开始一直变基 - 引入了不必要的合并冲突。

我认为最简单的方法是 rebase&squash 对implement_x 的进一步修复,然后将它们存储起来,并将存储应用到implement_x_rebased,但我很好奇是否有任何适当的方法让 git 意识到 @ 987654333@和implement_x_rebased其实是同一个状态?

【问题讨论】:

  • 我不知道这个问题的完美答案,但樱桃挑选也是一种选择。
  • 啊。樱桃采摘绝对比手动应用一些差异更容易和更好。我仍在等待直接回答我的问题的答案,但如果暂时没有答案,我会接受。
  • 请检查git rev-parse implement_x^{tree} implement_x_rebased^{tree} 看看这两个提交是否真的是相同的内容。

标签: git git-rebase


【解决方案1】:

这似乎是git rebase--onto 选项的任务。

git rebase --onto implement_x_rebased implement_x further_bar_fixes_that_depend_on_x

您可能想查看git rebase manual 中的--onto 示例。

【讨论】:

  • 确实,这种情况正是git help rebase 中的示例之一 (git rebase --onto master next topic),除了 rebase 的目标不仅仅是那个例子,但这对例子来说并不重要。
  • 很好的解决方案,但为了清楚起见,有一个名为A---B---C---D的分支示例会非常有帮助
【解决方案2】:

解决此问题的一种方法是首先使 implement_ximplement_x_rebased 相同,例如:

git checkout implement_x_rebased
git merge implement_x

然后以正常方式合并您的进一步修复。

implement_x 的合并从代码的角度来看应该是一个 NOOP(检查 git diff implement_x implement_x_rebased 实际上没有产生任何结果),但是您正在记录两者合并的事实,这将允许您拉回所有其他内容很容易。

如果它们不完全相同,您可能需要-s ours 选项。这记录了合并已经完成没有合并代码谨慎使用

如果做不到这一点,您可以简单地使用 git rebase 将后面的分支重新定位到 implement_x_rebased

这比摘樱桃好 a)您不需要挑选每个单独的提交,记住要正确排序等。 b) 从语义上讲,你的 git 树之后会更有意义

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 2013-06-03
    • 2020-07-04
    • 2015-03-28
    • 1970-01-01
    • 2022-11-11
    相关资源
    最近更新 更多