24.3 利用子树合并跟踪上游改动
的新提交合并过来呢?这就要用到名为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合并策略”。