假设我有一个名为master
的分支和一个名为upstream_lib
的分支。
分支master
有一个子目录lib
,它基于分支upstream_lib
上的代码; upstream_lib
中的更改会定期与master
分支合并(使用子树策略)。 lib
中的master
目录有一些不属于upstream_lib
的修改。
但是,假设这两个分支没有共同的历史记录(例如,因为存储库刚刚迁移到git),或者合并基础不正确,因为upstream_lib
中的合并已被压缩,已有一些变基或其他什么。
问题是:在upstream_lib
上给出一组新的更改,如何强制合并作为共同祖先考虑upstream_lib
的特定修订?
答案 0 :(得分:10)
我从未使用过subtree
策略,所以也许这是一个次优解决方案(也许它不会起作用^^),但您可以将所有新提交应用于upstream_lib
从master
行开始的临时分支,然后将其合并。我想到的并不是从根本上解决你的情况,所以每次你想要引入新的变化时你都必须做这种“手动合并”,但这是它的工作方式:
master
祖先行中的假共同祖先,例如master~100
。upstream_lib
行中的假共同祖先,比如说upstream_lib~150
。upstream_lib
分支的一次性副本:git branch --no-track new_upstream_lib upstream_lib
使用带有子树选项的递归策略将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
目录。
git checkout master && git merge new_upstream_lib && git branch -d new_upstream_lib
。