假设我有一个叫做master
分支的分支叫做分支upstream_lib
.
分支master
有一个子目录lib
,它基于分支上的代码upstream_lib
; 更改upstream_lib
将master
定期与分支合并(使用子树策略).该lib
目录中master
有一些自己没有的修改upstream_lib
.
但是,假设这两个分支没有共同的历史记录(例如,因为存储库只是迁移到git),或者合并基础不正确,因为合并upstream_lib
已被压扁,存在一些变基或其他.
问题是:给定一组新的更改upstream_lib
,如何强制合并作为共同祖先的特定修订版upstream_lib
?
Jo *_*iss 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
Run Code Online (Sandbox Code Playgroud)
请注意,即使您只关心目录,new_upstream_lib
现在也有整个master
树lib
.
git checkout master && git merge new_upstream_lib && git branch -d new_upstream_lib
.