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

Art*_*cto 17 git merge

假设我有一个叫做master分支的分支叫做分支upstream_lib.

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

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

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

Jo *_*iss 10

我从来没有使用过这个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_libmaster~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现在也有整个masterlib.

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