如何在git合并中强制共同的祖先?

时间:2011-01-12 11:29:16

标签: git merge

假设我有一个名为master的分支和一个名为upstream_lib的分支。

分支master有一个子目录lib,它基于分支upstream_lib上的代码; upstream_lib中的更改会定期与master分支合并(使用子树策略)。 lib中的master目录有一些不属于upstream_lib的修改。

但是,假设这两个分支没有共同的历史记录(例如,因为存储库刚刚迁移到git),或者合并基础不正确,因为upstream_lib中的合并已被压缩,已有一些变基或其他什么。

问题是:在upstream_lib上给出一组新的更改,如何强制合并作为共同祖先考虑upstream_lib的特定修订?

1 个答案:

答案 0 :(得分:10)

我从未使用过subtree策略,所以也许这是一个次优解决方案(也许它不会起作用^^),但您可以将所有新提交应用于upstream_libmaster行开始的临时分支,然后将其合并。我想到的并不是从根本上解决你的情况,所以每次你想要引入新的变化时你都必须做这种“手动合并”,但这是它的工作方式:

  1. 确定master祖先行中的假共同祖先,例如master~100
  2. 确定upstream_lib行中的假共同祖先,比如说upstream_lib~150
  3. 制作upstream_lib分支的一次性副本:git branch --no-track new_upstream_lib upstream_lib
  4. 使用带有子树选项的递归策略将new_upstream_lib重新导入master~100。 (我认为你不能只使用子树策略,因为正如你所说,lib中的master目录有自己的变化。)这是一个完全未经测试的命令:

    git rebase -s recursive -X subtree=lib --onto master~100 upstream_lib~150 new_upstream_lib
    

    请注意,new_upstream_lib现在包含整个master树,即使您只关心lib目录。

  5. 合并:git checkout master && git merge new_upstream_lib && git branch -d new_upstream_lib