[英]How to force a common ancestor in a git merge?
假设我有一个名为master
的分支和一个名为upstream_lib
的分支。
分支master
有一个子目录lib
,它基于分支upstream_lib
上的代码; upstream_lib
中的更改会定期与master
分支合并(使用子树策略)。 master
的lib
目录有自己的一些修改,不在upstream_lib
。
但是,假设两个分支没有共同的历史记录(例如,因为存储库刚刚迁移到git),或者合并基础不正确,因为upstream_lib
的合并已经被压缩,有一些变基或其他什么。
现在的问题是:给出一组新的变化upstream_lib
,如何强制合并考虑的共同祖先的一个特定修订upstream_lib
?
我从来没有使用的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
。 (我认为你不能只使用子树策略,因为正如你所说, master
的lib
目录有自己的变化。)这是一个完全未经测试的命令:
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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.