【问题标题】:Rebasing a merged branch重新定位合并的分支
【发布时间】:2019-11-21 04:41:02
【问题描述】:

我有以下提交历史:

* c742f81 (HEAD -> new_feature) x8
* 1869290 x7
* 697809b x6
*   a61e55c x5
|\  
| * da890d6 (master) n6
| * ccc8f5e n5
| * 0095064 n4
| * 002ab13 n3
| * cb93dc4 m4
| * ccaa631 m3
* | 714da58 x4
* | ea11b0d x3
* | 66f1582 x2
* | 3e96100 x1
|/  
* 4f46723 m2
* ce576e8 1

如您所见,我在n6 上有master 分支,在x8 上有new_feature 分支。我运行git rebase -i master new_feature 得到了这个:

pick 3e96100 x1
pick 66f1582 x2
pick ea11b0d x3
pick 714da58 x4
pick 697809b x6
pick 1869290 x7
pick c742f81 x8
Rebase `da890d6..c742f81` onto `714da58` (7 commands)

现在, 为什么我收到 714da58 ?不应该是da890d6 吗? 另外,x5 在哪里(Git 应该重新设置在 x5 中合并的提交)?

【问题讨论】:

  • 当你在一个合并提交之后重新设置基准时,通常 Git 会忽略合并并且不会尝试重做它们。在这种情况下,变基可能不是最佳选择。

标签: git


【解决方案1】:

在这种情况下,您告诉 Git 要做的就是采用 new_feature 并将其重新定位(重放)在 master 之上。 Git 向您展示的是将放在 master 之上的提交。

在这种情况下,您会看到 x1x4,因为它们位于 new_feature 而不是 master,并且您告诉 Git 您想将所有此类提交重播到 master。你看不到n6,因为它不会被重新定位:它已经在 master 上。您缺少 x5,因为默认情况下 git rebase 不会重播合并。在这种情况下,这是有道理的,因为合并不会引入任何新内容。

但是,如果您愿意,可以使用 --rebase-merges 选项到 git rebase 重新创建合并;这样做需要一个相对较新的 Git 版本。

您会看到 714da58 条目,因为 Git 最终可以使用 reflog 作为找到更好的共同祖先的基础;这记录在--fork-point 选项中。这并不总是产生一个“合乎逻辑”的提交,但它通常会产生一个更好的变基。可能在某些时候您的分支位于714da58,这两个分支也不常见。

【讨论】:

  • 我的问题是如果不是n6 那么为什么714da58
  • 您输入的命令是rebase -i master new_feature,这意味着在分支主控之上重新设置分支新功能。需要“重新定位”的提交是 new_feature 上的提交,而不是 master 上的提交。 (也不要 rebase 合并提交。)这些提交是 x1、x2、x3、x4、x6、x7、x8。 x5 是一个合并提交,所以它被跳过了。 m 和 n 提交在 master 上,因此不会重新设置。
  • @DavidSugar ,如果我将 new_feature 重新设置在 master 上,那么 master 分支的尖端是 n6 而不是 714da58 ?我从来没有说过基于714da58 的rebase - 无论如何这是一个中间提交。
  • @BreakingBenjamin:正如 bk2204 所说,新基地必须来自分叉点处理。在这种情况下,它似乎是荒谬的,因此您可能希望将--no-fork-point 添加到命令行以防止 Git 使用 fork-point 方法。
  • @torek,不幸的是,上面的 repo 丢失了,当尝试在类似的示例上运行 git rebase 命令时,我得到了正确的主提交,new_feature 将并且应该 rebase 即主提示。但这里有一个疑问 - 除了 git rebase 并且除非明确指定 --fork-point 标志,否则 git rebase 不使用分叉点方法来计算更好的共同祖先。那么,为什么在我的案例中使用它?我刚刚跑了git rebase -i master new_feature
【解决方案2】:

现在,为什么我收到 714da58 ?不应该是da890d6吗?

是的,它将是da890d6。有bug in git表示某些场景下rebase的显示信息错误。

另外,x5 在哪里(Git 应该 rebase 合并的提交 x5)?

--rebase-merges 选项不与 git rebase 一起使用时,任何合并提交都会被扩展(比如这里的 x5 是合并提交,将被删除并且 n3,n4,n5,n6,m​​3 和 m4 将被纳入它的位置)并且 git 会将这些提交放入单个线性分支(此处为 x4 上方)。但是观察一下,n3,n4,n5,n6,m​​3 和 m4 都被masternew_feature 共享。因此,new_feature..master 不会选择它们,而 git rebase -i master new_feature 会这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    相关资源
    最近更新 更多