繁体   English   中英

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

[英]How to force a common ancestor in a git merge?

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

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

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

现在的问题是:给出一组新的变化upstream_lib ,如何强制合并考虑的共同祖先的一个特定修订upstream_lib

我从来没有使用的subtree的策略,所以也许这是一个次优的解决方案(也许它不会工作^^),但你可以应用所有新提交upstream_lib到临时党支部关闭的master行,然后合并那。 我想到的并不是从根本上解决你的情况,所以每次你想要引入新的变化时你都必须做这种“手动合并”,但这是它的工作原理:

  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 (我认为你不能只使用子树策略,因为正如你所说, masterlib目录有自己的变化。)这是一个完全未经测试的命令:

     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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM