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

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合并策略”。