GitHub上含Git submodules的Android项目同步提交最佳策略咨询
嘿,这个场景我太熟了——同时在主项目和子模块里改代码,想要同步提交确实得讲究点策略,不然很容易搞混版本,甚至出现别人拉取代码后子模块找不到对应版本的问题。我给你拆解一套清晰的流程:
1. 分支策略:主项目+子模块都建议建新分支
我的建议是两个项目都单独创建新分支,原因很简单:
- 对主项目:从当前的主分支(比如
main或develop)切一个功能分支,比如feature/user-profile-optimize,把你的主项目修改都放在这个分支里,和主分支隔离开,避免干扰团队其他人的代码。 - 对子模块:进入子模块目录,同样从它的主分支切一个对应功能的分支,比如
feature/add-profile-utils,这样你的子模块修改也有独立的迭代空间,后续不管是自己测试、提交PR还是合并,都更安全。
当然,如果是非常微小的、不会影响他人的修改(比如改个注释),也可以直接在主分支改,但强烈建议用分支隔离——尤其是团队协作场景,能帮你避开90%的版本冲突问题。
2. 修改操作:正常并行修改即可
这一步没什么特殊的,就像你平时改代码一样:
- 主项目的修改:就在主项目根目录下正常写代码、调试Android项目,该改布局改布局,该写逻辑写逻辑。
- 子模块的修改:直接进入子模块的目录(比如
./modules/common-ui),修改里面的代码就行。你可以用Android Studio单独打开子模块调试,也可以在主项目里联动调试,Git会自动追踪子模块的版本变化。
3. Commit & Push:先子模块,后主项目,同步提交所有变更
这是最关键的一步,顺序绝对不能搞反,不然主项目会记录一个不存在的子模块commit哈希,别人拉取代码会报错:
- 先处理子模块的提交和推送:
- 进入子模块目录:
cd ./modules/common-ui - 检查修改:
git status - 暂存所有修改:
git add . - 提交变更:
git commit -m "feat: 新增用户头像裁剪工具类" - 推送到远程分支:
git push origin feature/add-profile-utils
- 进入子模块目录:
- 再处理主项目的提交和推送:
- 返回主项目根目录:
cd ../.. - 检查状态:
git status,你会看到子模块目录显示为modified——这是正常的,因为主项目需要记录子模块当前的最新commit哈希 - 暂存主项目的修改(包括子模块的版本引用):
git add . - 提交变更:
git commit -m "feat: 集成子模块的头像裁剪功能,优化用户资料页" - 推送到远程分支:
git push origin feature/user-profile-optimize
- 返回主项目根目录:
- 后续合并到主分支:
等你的功能测试没问题后,分别在子模块和主项目的远程仓库提交PR,合并到各自的主分支。之后记得更新主项目里的子模块引用:拉取子模块主分支的最新代码,然后提交主项目的子模块版本更新即可。
小提醒:如果不小心先推了主项目,别慌——先把子模块的变更推上去,然后再重新提交主项目的子模块版本更新,推一次就行,不会有问题。
内容的提问来源于stack exchange,提问作者user3866498




