子树策略合并是什么
git merge -s subtree 把对方仓库的提交对齐到当前仓库的某个子目录再合并,专治没有子树元数据的「库中库」场景:历史上一直是手工把对方代码拷进某个目录,现在想用正式合并通道接管。该策略靠启发式比对树结构与目录偏移,判断对方内容在本地对应的前缀,因此依赖双方目录结构保持稳定;新项目更推荐用 git subtree 命令或子模块。
基本信息
| 用途 | 把外部仓库并入本地指定子目录 |
|---|---|
| 语法 | git merge -s subtree -X subtree=<子目录> <分支> |
| 适用前提 | 本地子目录里已有人工同步的对方代码,且结构稳定 |
| 替代方案 | git subtree add/pull(推荐),或子模块 |
| 稳定性 | 启发式匹配,目录结构大改时可能错位 |
| 前置检查 | 确认本地子目录内容与对方某次提交基本一致 |
典型使用场景
- 历史遗留的 vendor 目录:一直是人工复制对方代码,换成正式合并通道。
- 一次性并入外部仓库:不引入 subtree 元数据,只求把历史对齐。
- 应急并入上游修复:把对方某分支的修复合并进本地子目录。
- 迁移过渡:先用它对齐现状,再逐步切换到 git subtree 或子模块。
- 多来源聚合:仓库里汇集了多个外部组件,逐一建立合并关系。
常用示例
常用示例
git remote add vendor https://example.com/vendor/lib.git # 加远端
git fetch vendor # 取回对方历史
git merge -s subtree -X subtree=vendor/lib vendor/main # 对齐合并到子目录
git log --oneline --graph -5 # 核对合并结果与方向三种方案对照
| 方式 | 元数据 | 更新可靠性 |
|---|---|---|
| -s subtree | 无元数据 | 启发式,结构大改会错位 |
| git subtree | 有前缀与合并记录 | 可靠,支持 pull/push |
| 子模块 | 指针加配置文件 | 精确锁定提交,需初始化 |
-s subtree 依赖启发式判断目录偏移,对方目录结构大改时可能错位;用前先备份分支并逐次核对 diff,确认对方内容确实落在预期子目录。