首页/开发/Git 与协作速查/子树的更新与回推
进阶与大仓实践69 条

子树的更新与回推

subtree pull 拉取上游更新到前缀目录;subtree push 把本仓库中该目录的提交生成到目标分支,用于把本地改动回馈上游。

Git 与协作速查开发更新于 2026-10-13

subtree 的拉取与回推

subtree 的日常维护靠两条命令:subtree pull 把上游仓库的更新拉进前缀目录,subtree push 把本仓库中该目录的提交回推到上游分支。回推本质是 subtree split 后推送,会把目录历史重建为提交链;大型仓库耗时明显,频繁回推说明该考虑换协作方式,例如共享仓库或依赖管理。

基本信息

拉取git subtree pull --prefix=<目录> <远程> <分支> [--squash]
回推git subtree push --prefix=<目录> <远程> <分支>
等价关系回推本质是 split 后推送
提交粒度--squash 把上游更新压成一个提交
远程约定常用单独 remote 指向上游仓库

典型使用场景

  • 内嵌公共库:上游修复同步到本地目录
  • 本地改进回馈:把本仓库里的目录改动推回上游仓库
  • 供应商分支:跟随第三方发布分支又保留本地补丁
  • 迁移过渡:fork 与上游保持一致,迁移期双向同步
  • 版本发布同步:上游打标签后把该版本合入本地目录
  • 只读跟随:只需要拉取上游更新、不打算回馈时,pull 后无需配置推送凭据

常用示例

常用示例
git remote add vendor https://example.com/vendor/common.git  # 指向上游
git subtree pull --prefix=libs/common vendor main --squash   # 拉取上游更新
git subtree push --prefix=libs/common vendor patch-1         # 回推本目录改动
git log --oneline -5 -- libs/common                          # 核对目录历史

pull 与 push 对照

命令方向要点
subtree pull上游到本地目录建议 --squash 控制历史形态
subtree push本地目录到上游重建提交链后推送,耗时随历史增长
subtree split中间产物独立历史分支,可检查或导出
漏写 --squash 时两侧历史形态不一致,后续 pull 容易冲突频发;团队先统一拉取方式再铺开。
回推目标分支的权限要求常与主仓库不同:先在测试分支验证再推真实分支。
多处镜像:同一上游有主站与镜像时用不同 remote 名分别管理,避免配置互相覆盖。
提交历史整洁度:回推前先把目录内提交整理成有意义的几条,零碎提交推给上游会带来审查负担。

易错点

  • squash 策略不统一:有的用有的不用,双方历史交织后冲突变多
  • 回推大目录耗时:历史越长重建越慢,频繁回推先评估换协作方式
  • 权限不足被拒:回推分支属于上游仓库,凭据与保护规则要提前与上游确认
  • 把 subtree 当 submodule 用:语义完全不同,团队统一认知后再选用
  • 目录改名或搬迁后要同步更新 prefix 参数:写死的路径一变,拉取与回推都会指向错误目录,改名前先约定新路径并全员同步

数据来源与参考

  • Git 官方文档:git-subtree(pull/push)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌