本地含子模块仓库同步远程:选Stash还是Commit?
本地子模块与远程同步的解决方案
一、Commit 和 Stash 的核心区别
- Commit:将当前未提交的变更作为新提交永久记录到本地仓库历史中,这些变更会成为本地分支的一部分。
- Stash:把未提交的变更临时存储到Git的临时存储区,不会写入提交历史,之后可通过
git stash pop恢复,也能直接丢弃。
二、你的场景下的正确操作
你的目标是让本地与远程完全一致且无需保留本地未提交变更,不需要使用Commit或Stash,正确步骤如下:
- 放弃本地所有未提交变更(包括子模块相关修改):
该命令会强制将本地仓库状态恢复到当前HEAD指向的提交,彻底丢弃所有未提交修改。git reset --hard HEAD - 拉取远程仓库最新内容:
此时本地会同步远程删除5个子模块的提交,更新git pull.gitmodules文件。 - 清理本地残留的多余子模块目录:
第一条命令取消所有本地子模块的初始化,第二条命令根据更新后的git submodule deinit -f -- . git submodule update --init --recursive.gitmodules重新初始化并同步现有子模块,自动删除多余的子模块目录。
三、关于Commit的意义(若选择Commit)
如果选择Commit,意味着你要把本地当前的未提交变更(比如子模块的删除或修改)保存到本地历史中。之后拉取远程内容时,很可能会出现冲突——远程已有一个删除子模块的提交,而你本地也提交了类似变更,需要手动解决冲突才能合并。
这种操作完全不符合你“让本地与远程完全一致”的目标,Commit会把本地修改加入历史,反而增加了同步的复杂度,因此完全不推荐。
内容的提问来源于stack exchange,提问作者tadm123
相关产品推荐
相关产品推荐

