【问题标题】:How to reintegrate topic branches after a squash and merge?如何在压缩和合并后重新整合主题分支?
【发布时间】:2020-02-25 09:08:26
【问题描述】:

我通常完全接受 git 中的合并,但我最近开始研究一个存储库,其中将主题分支合并到主分支的策略是将它们压缩为单个提交。

我刚刚发现,在尝试重新集成基于第一个主题分支的第二个主题分支时,这会导致完全混乱。

假设我有:

A-I'          master
 \
  B-C-E-G-I   topicA
     \   \
      D-F-H-J topicB

其中I' 是从topicAmaster 的压缩合并。

如果我将master 合并到topicB 中,那么会有很多冲突。使用合并工具是没有用的,因为 LOCAL 将包含来自 ABCDEFGHJ 的更改,REMOTE 将是 ABCEGI 而 BASE 是 A。尝试查看 IDFHJ 的差异可能非常困难。如果我放弃合并工具,只区分 LOCAL 和 REMOTE,那么更改会更加明显,但我必须手动解决所有冲突。

如果我将topicB 重新设置为master,那么它会变得更加奇怪,因为BI 之间的各种文件在topicA 上发生了变化,因此将ABCDFJ 重新应用到I' 会产生废话。

如何将I' 转换为topicB

有没有更好的方法来整合主题分支,将来可以避免这种情况?

【问题讨论】:

    标签: git git-merge rebase


    【解决方案1】:

    小恶竟然是:

    git rebase --onto origin/master topicA topicB
    

    我没有太注意应用了哪些提交,但我猜合并提交 (H) 丢失了。

    至于避免这种情况,如果该主题分支将被压缩合并,合并主题分支似乎是在自找麻烦,因为这实际上是在重写上游分支的历史,众所周知这是一个坏主意。

    我很想听听其他人是如何解决这个问题的,因为围绕合并人员的 FUD 似乎倾向于将变基作为“更简单”的工作流程。


    另一个我发现非常有用的变体是:

    git rebase -i -r --onto origin/master topicA topicB
    

    这将启动一个交互式 rebase 并向您显示在哪些分支上进行了提交。这使得删除在topicA 上所做的任何提交变得非常容易。如果没有这个,这些提交将被重播到master,这可能会导致各种冲突,因为这些更改已经存在。

    【讨论】:

    • 特定的 rebase 复制提交 JFD:可从 topicB 访问的三个非合并提交 / 提交 J 也无法从topicA/提交I。这种方法没有任何问题:如果它对您来说顺利进行并且对其他人没有任何问题,那么这是一个很好的方法。
    猜你喜欢
    • 1970-01-01
    • 2020-02-24
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 2013-03-12
    • 1970-01-01
    • 2016-01-29
    相关资源
    最近更新 更多