如何正确提交/推送Git subtree子仓库的代码变更?
Git Subtree 代码变更提交/推送完整流程
当你修改了嵌入主仓库的Protocol subtree代码后,需要分两步完成变更同步:先提交到主仓库本地,再推送到独立的Protocol仓库,具体命令序列如下:
将subtree目录的变更加入暂存区
把修改后的Protocol目录下所有变更加入Git暂存区:git add my/folder(
my/folder是你嵌入subtree的实际路径,替换成自己的目录名)提交变更到主仓库本地分支
像常规提交一样,把变更提交到主仓库的本地历史:git commit -m "更新Protocol:新增XX接口字段"若只想单独提交subtree的变更,可使用:
git commit my/folder -m "仅更新Protocol"。将subtree变更推送到独立的Protocol仓库
最后把subtree的变更同步到远程的Protocol仓库,确保另一端仓库能拉取到:git subtree push --prefix=my/folder subtree_origin master注意:
subtree_origin是你之前为Protocol仓库添加的远程别名,若未添加,先执行git remote add subtree_origin <Protocol仓库的Git地址>。
另一端仓库要拉取更新的Protocol,执行:
git subtree pull --prefix=my/folder subtree_origin master
主仓库(非Subtree部分)的操作
主仓库中非subtree的代码变更,完全按照常规Git流程操作即可:
git add <非subtree文件/目录>git commit -m "修改主仓库XX功能"git push origin <主仓库分支名>
这些操作和subtree的提交、推送互不干扰,subtree的提交只是主仓库历史的一部分,不会影响主仓库本身的远程同步。
其他替代方案
除了subtree,还有几种常见的跨仓库共享代码的方式,各有优劣:
- Git Submodule:在主仓库中保存Protocol仓库的特定commit引用,子模块是独立仓库。优点是子模块版本完全独立,缺点是克隆、切换分支时需要额外执行
git submodule init、git submodule update,新手容易出现子模块版本不一致的问题。 - Monorepo:把两端硬件代码和Protocol放在同一个Git仓库中,用目录划分不同模块。优点是无需跨仓库同步,代码关联修改更方便,缺点是仓库体积会随着代码量增长变大,适合团队规模较小、代码关联性强的场景。
- 独立发布Protocol为依赖库:将Protocol打包成可分发的依赖包(比如C/C++的静态库/头文件、Python的PyPI包、Go的Module),两端仓库通过包管理工具引入依赖。优点是版本管理清晰,无需Git子系统操作,缺点是需要维护包的发布流程,适合Protocol相对稳定、有版本迭代需求的场景。
内容的提问来源于stack exchange,提问作者gearhead
相关产品推荐
相关产品推荐

