Git 的子树合并和子树拆分 可以通过 Git 的 su btree 合并策略实现分支到目录的跟踪,之前我也是一知半解。这次在准备书稿过程,总算是搞明白了,也发现我在写 Gistore 时可以使用更好的算法,有时间我再改进 gistore 吧。 下面是我书稿中的部分内容: 5.5 子树合并 使用子树合并,同样可以实现在一个项目中引用其它项目的数据。但是和子模组方式不同的是,使用子树合并模式,外部的版本库整个复制到本版本库中并建 立跟踪关联。使用子树合并模型,使得对源自外部版本库的数据的访问和本版本库数据的访问没有区别,也可以对其进行本地修改,并且能够通过子树合并的方式将 对源自外部版本库的改动和本地的修改相合并。 5.5.1 引入外部版本库 为演示子树合并,我们需要至少准备两个版本库,一个是将被作为子目录引入的版本库 u til.git ,另外一个是主版本库 main.git 。 $ git --git-dir=/path/to/util.git init --bare $ git --git-dir=/path/to/main.git init --bare 在本地检出这两个版本库: $ git clone /path/to/util.git $ git clone /path/to/main.git 我们需要为这两个空版本库添加些数据。非常简单,每个版本库下我们只创建两个文件: Makefile 和 version。当执行 make 命令时显示 version 文件的内容。我们对 version 文件多次提交以建立多个提交历史。别忘记在最后使用 git pu sh origin master 将版本库推送到远程版本库中。 Makefile 文件示例如下: all: @cat version 我们之前尝试的 git fetch 命令都是获取同一项目的版本库的内容。其实命令 git fetch 并不禁止你用它获取不同项目的版本库数据,因为 Git 的版本库不像 Subversion 那样用一个唯一的 UUID 标识让 Subversion 的版本库之间势同水火。当然你也可以用 git pull,但是那样将把两个项目的文件彻底混杂在一起,对于我们这个示例来说,因为两个项目具有同样的文件 Makefile 和 version,使用 git pull 将导致冲突,是我们不愿意出现的。所以为了将不同项目的版本库引入,我们需要用 git fetch 。 为了便于以后对外部版本库的跟踪,在使用 git fetch 时,最好先在 main 版本库中注册远程版本库 util.git。 $ git remote add util /path/to/util.git $ git remote -v origin /path/to/main.git/ (fetch) origin /path/to/main.git/ (push) util /pat...