如何将本地Git仓库及子模块同步为与远程仓库完全一致的状态?
解决方案
首先明确:git pull --rebase没法直接在脏仓库状态下执行——Git会因为存在未提交的本地修改直接报错,而且它本身也不会自动同步子模块。要让本地仓库完全和远程保持一致,同时更新所有子模块,按以下步骤操作:
1. 清空本地未提交修改(主仓库)
如果你确定要放弃所有本地未提交的变更(包括工作区和暂存区内容),执行:
git reset --hard HEAD
这个命令会将主仓库状态强制重置为当前HEAD对应的提交,所有未提交的修改都会被永久清除。
2. 拉取远程代码并同步子模块
直接使用带递归子模块参数的拉取命令,一步完成主仓库和子模块的同步:
git pull --recurse-submodules
如果需要保持提交历史线性,也可以结合变基参数:
git pull --rebase --recurse-submodules
该命令会先拉取远程主仓库的最新代码并做变基,同时自动将所有子模块更新到对应提交的状态。
3. 单独强制更新子模块(可选)
如果上述命令未完全同步子模块,或者需要确保子模块完全匹配远程指定版本,执行:
git submodule update --init --recursive --force
--force参数会强制子模块重置为主仓库记录的提交版本,子模块本地的未提交修改也会被丢弃。
重要注意事项
git reset --hard和git submodule update --force会永久删除本地未提交的修改,执行前务必确认这些内容已无保留必要。- 若本地存在已提交但未推送到远程的改动,
git pull --rebase会将这些提交变基到远程最新提交之上;如果连这些本地提交也想丢弃,需先执行git reset --hard origin/<你的分支名>(例如git reset --hard origin/main),再进行拉取和子模块同步。
内容的提问来源于stack exchange,提问作者EheRo
相关产品推荐
相关产品推荐

