You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Git子模块异常:未拉取指定提交而是最新提交问题咨询

Git子模块行为解析与你的理解误区

这是Git子模块的正常行为

你碰到的情况完全是git submodule update --remote --merge命令的正常表现:

  • .gitmodules里设branch = develop,就是给--remote参数指定跟踪的远程分支;
  • git submodule update --remote的核心逻辑就是跳过父仓库里记录的子模块固定提交哈希,直接拉取子模块指定远程分支(这里是develop)的最新提交;
  • 加--merge参数的话,会把远程分支的最新提交合并到本地子模块分支,同时更新父仓库里记录的子模块提交哈希(要是你之后提交父仓库的话)。

你的理解误区

你搞混了Git子模块的两种核心工作模式:

  1. 固定提交模式(默认):父仓库会存一个子模块的具体提交哈希(就是你说的1ff703eda1b357efdecbffb2422b6fcc99a48557),执行不带--remote的git submodule update时,不管子模块远程分支有没有新内容,都会把它切到这个固定哈希对应的提交。
  2. 跟踪远程分支模式(需--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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 19:21:08