Git子模块更新后为什么代码没变?

a'ゞ雨妍 阅读 10

我在项目里加了个子模块,拉取了最新提交,但本地代码好像没更新,还是旧的。明明在子模块目录里执行了 git pull,也看到有新commit,可主项目引用的组件还是老样子。

比如我主项目里这样引用子模块里的组件:

<script type="module">
  import { Button } from './submodules/ui-lib/components/button.js';
  // 使用Button...
</script>

是不是光pull子模块不够?还需要在主仓库里再提交一次子模块的指针变更?有点懵……

我来解答 赞 9 收藏
二维码
手机扫码查看
1 条解答
爱学习的啸喆
兄弟,你遇到的这个情况太常见了,我当初也被子模块坑过。

问题在于你对子模块的理解有点偏差。子模块在主项目里本质上就是一个"指针",它记录的是子模块仓库的某个特定commit SHA,而不是"最新版本"。你在子模块目录里pull确实把子模块本身更新了,但主项目里的那个指针还指着旧commit呢。

来解决这个问题,有两种常见方式:

方式一:手动在主项目里更新指针

第一步,进入子模块目录,切换到主分支并拉取最新

cd submodules/ui-lib
git checkout main
git pull


第二步,回到主项目,会看到子模块有变更

cd ../..
git status


你会看到类似 new commit 的提示,说明子模块的指针变了

第三步,提交这个变更

git add submodules/ui-lib
git commit -m "更新子模块到最新版本"


这样主项目就指向新的commit了。

方式二:用命令一步到位(推荐)

如果你想直接让子模块更新到最新,然后用一条命令搞定:

git submodule update --remote submodules/ui-lib

然后同样需要在主项目里add和commit这个变更。



原理说白了就是:主项目依赖的不是"子模块最新",而是"子模块的某个具体版本"。子模块本身更新了,但你没告诉主项目要用新版本,主项目就继续用旧的。

所以你猜对了,就是需要在主仓库里再提交一次子模块指针的变更。子模块的pull只是更新了子模块本身,主项目的引用不会自动跟着变。
点赞
2026-03-17 14:10