24.3 利用子树合并跟踪上游改动

    空标题文档 - 图1

    的新提交合并过来呢?这就要用到名为subtree的合并策略[1]

    在执行子树合并之前,先切换到util-branch分支,获取远程版本库的改动。


    $git checkout util-branch $git pull remote:Counting objects:8,done. remote:Compressing objects:100%(4/4),done. remote:Total 6(delta 0),reused 0(delta 0) Unpacking objects:100%(6/6),done. From/path/to/repos/util 12408a1..5aba14f master->util/master Updating 12408a1..5aba14f Fast-forward version|2+- 1 files changed,1 insertions(+),1 deletions(-) $git checkout master

    在切换回master分支后,如果这时执行git merge util-branch,会将uitl-branch的数据直接合并到master分支的根目录下,而实际上是希望合并发生在lib目录中,这就需要以如下方式进行调用,以subtree策略进行合并。

    如果Git的版本小于1.7,直接使用subtree合并策略。


    $git merge-s subtree util-branch

    如果Git的版本是1.7之后(含1.7)的版本,则可以使用默认的recursive合并策略,通过参数-Xsubtree=<prefix>在合并时使用正确的子树进行匹配合并。避免了使用subtree合并策略时的猜测。


    $git merge-Xsubtree=lib util-branch

    再来看看执行子树合并之后的分支图示。


    $git log—graph—pretty=oneline *f1a33e55eea04930a500c18a24a8bd009ecd9ac2 Merge branch 'util-branch' |\ |*5aba14fd347fc22cd8fbd086c9f26a53276f15c9 util v3.1->v3.2 |*a6d53dfcf78e8a874e9132def5ef87a2b2febfa5 util v3.0->v3.1 *|62ae6cc3f9280418bdb0fcf6c1e678905b1fe690 subtree merge |\ ||/ |*12408a149bfa78a4c2d4011f884aa2adb04f0934 util v2.0->v3.0 |*f21f9c10cc248a4a28bf7790414baba483f1ec15 util v1.0->v2.0 |*76db0ad729db9fdc5be043f3b4ed94ddc945cd7f util v1.0 *911b1af2e0c95a2fc1306b8dea707064d5386c2e main v2010.1

    [1]参见第3篇第16章“16.6合并策略”。