如何在不重新添加子模块的情况下合并Pull Request?
解决方案分析
你的思路方向是对的,但具体步骤需要调整才能达到预期目的,下面详细拆解:
你的方法可行性
直接把F合并到分支B再变基到M的操作,如果不手动处理子模块冲突,还是会把F里的子模块内容带进来。因为合并F到B时,Git会默认保留F中存在的子模块相关文件(.gitmodules、子模块目录),变基只是把B的提交移到M的顶端,不会自动丢弃这些子模块内容。
但如果在合并/变基过程中手动解决冲突,丢弃F中所有和子模块相关的改动,只保留业务代码修改,那么最终合并到M后,历史里不会出现“移除→添加→再移除”的无效记录,也不会导致他人拉取时重新添加子模块。
更高效的操作步骤
不需要先合并到B再变基,直接基于主分支M处理更简单:
- 从当前M分支创建临时分支B:
git checkout -b B M - 执行合并但不自动提交:
git merge F --no-commit - 手动清理子模块相关内容:
- 删除
.gitmodules文件:rm .gitmodules - 删除所有子模块目录:
rm -rf path/to/submodule1 path/to/submodule2 ... - 把这些删除操作加入暂存区:
git add .
- 删除
- 提交合并结果:
git commit -m "Merge F's changes without restoring submodules" - 把B分支合并到M:
git checkout M && git merge B
这样处理后,M分支的最终状态完全没有子模块,合并提交里只包含F的业务改动,历史里也不会出现重新添加子模块的记录。
关于他人拉取的问题
只要M分支的最新提交中没有任何子模块相关文件(.gitmodules、子模块目录),其他开发者拉取最新的M分支时,Git会自动同步到无Submodule的状态,不会重新添加子模块。因为Git是基于当前提交的快照来构建工作区,只要最新快照里没有这些内容,就不会有拉取问题。
内容的提问来源于stack exchange,提问作者Silverlan
相关产品推荐
相关产品推荐

