在最终合并章鱼之前清理常见的提交

时间:2017-09-25 19:44:41

标签: git git-merge rebase git-interactive-rebase

我正在帮助将长期运行的项目集成到主线中。想要回来的一个功能分支本身就是一个章鱼合并(不是单个章鱼合并,而是几个合并随着时间推移)许多其他"迷你功能"分支。

这些迷你功能分支中的每一个都在其独特的内容中穿插了一组共同​​的提交,这些提交被挑选到每个相应的迷你功能分支中。我想在合并回主线之前清理所有这些常见的提交。

可能相关的是功能分支的当前状态是"正确",即代码看起来的样式是它应该是什么样子。

我尝试的选项:

  1. 直接rebase -i:导致了很多冲突,可能是因为已经应用于多个迷你功能分支的樱桃选择已经解决了
  2. rebase -i -p:这会产生完全相同的分支结构,并且公共提交重复
  3. 在正常情况下,我只是挥动投降的白旗并进行壁球合并。但是,我需要做的是用新的和改进的一组常见提交替换这些常见提交 - 这表明rebase是最合适的继续方式。

    理想的是将rebase -i与冲突解决策略一起使用,尝试通过选择使结果看起来最像目标(当前章鱼功能分支)的冲突选择来解决冲突。但我不知道如何告诉git这样做。

    我的问题:

    1. 有什么方法可以告诉git以上述方式解决冲突?
    2. 有没有更好,更清洁的方法来实现我的目标?
    3. 我是否已经使用rebase手动重建这些迷你功能分支?

1 个答案:

答案 0 :(得分:0)

我将假设您对合并有很多了解(在查找方面 - 或者在某些情况下,创建 - 一个常见的合并基础,将端点与合并区分开来基础,并结合差异)并直接跳到这些答案:

  1. 没有。在某些情况下,一个简单的答案:只使用最终版本。但这只适用于最终版本是正确的版本。你给出的有点模糊的文字描述告诉我,你现在想要选择一个中间结果,在未来与其合并基础和分支提示的合并时,将产生最小量的冲突。

    这显然是一个难题,甚至可能是NP-hard或NP-complete(通过有力的挥手证明:-))。内部节点有太多的自由度。

  2. 也许。要了解一下,请绘制您现在拥有的图形,以及最终想要的图形。 (也就是说,绘制提交结构,其分支和合并,以及对每个提交的一组提交的近似。)使用近似内容标记提交并使用它来设想合并步骤。根据您想要保留的内容以及您愿意放弃的内容重新排列中间结构,以获得您重视的任何内容。

  3. 考虑使用git merge(复制提交 - 那里没有分支)来构建新结构,而不是rebase(复制提交然后移动分支标签)标签动作,但当前分支以通常方式前进)。这样,您只需在现有结构旁边添加结构。您可以构建它们直到它们完成(随时使用{{1}}添加合并),然后当所有/或完成时,然后您声明您的"标志日&# 34;并使每个人从旧提交(由现有分支名称命名)切换到新提交(具有旧提交的每个人必须获得新提交并移动他们的分支名称以指向新提交)。