Git子模块异常:未拉取指定提交而是最新提交问题咨询
Git子模块行为解析与你的理解误区
这是Git子模块的正常行为
你碰到的情况完全是git submodule update --remote --merge命令的正常表现:
.gitmodules里设branch = develop,就是给--remote参数指定跟踪的远程分支;git submodule update --remote的核心逻辑就是跳过父仓库里记录的子模块固定提交哈希,直接拉取子模块指定远程分支(这里是develop)的最新提交;- 加
--merge参数的话,会把远程分支的最新提交合并到本地子模块分支,同时更新父仓库里记录的子模块提交哈希(要是你之后提交父仓库的话)。
你的理解误区
你搞混了Git子模块的两种核心工作模式:
- 固定提交模式(默认):父仓库会存一个子模块的具体提交哈希(就是你说的1ff703eda1b357efdecbffb2422b6fcc99a48557),执行不带
--remote的git submodule update时,不管子模块远程分支有没有新内容,都会把它切到这个固定哈希对应的提交。 - 跟踪远程分支模式(需--remote触发):一旦用了
--remote参数,Git就会忽略父仓库里存的固定哈希,直接拉取子模块指定远程分支的最新提交——这就是你看到“拉取develop分支新提交”的原因。
为什么cd submodule; git log显示旧提交
你在子模块目录执行git log看到旧提交,大概率是这两种情况:
- 你跑了
git submodule update --remote --merge后没提交父仓库里更新后的子模块哈希,之后又执行了普通的git submodule update,Git会把父仓库记录的旧哈希同步到子模块,所以子模块又切回了旧提交; - 或者你本地看的是父仓库记录的子模块提交,但部署脚本单独执行了
git submodule update --remote,导致部署环境拉了最新提交。
怎么固定拉取指定的旧提交
要是你想部署时稳准狠拉1ff703eda1b357efdecbffb2422b6fcc99a48557这个提交,这么做:
- 去掉
--remote参数,直接执行git submodule update,Git会严格按照父仓库记录的哈希切换子模块; - 确保部署脚本里不用
--remote,改用git submodule update --init --recursive(首次拉取时)或者普通的git submodule update。
内容的提问来源于stack exchange,提问作者user989988
相关产品推荐
相关产品推荐

