hyf/reademe/submodule/子模块修改后的冲突处理.md

71 lines
2.2 KiB
Markdown
Raw Permalink Normal View History

2025-12-04 14:24:49 +08:00
实际行为
当你在子模块有未提交的修改时执行 git submodule update
cd thingsboard-client-demo
# 修改了一些文件,但没有 commit
cd ..
git submodule update
Git 会:
检测到子模块有未提交的修改
拒绝更新,并给出类似这样的错误:
error: Your local changes to the following files would be overwritten by checkout:
src/main/java/SomeFile.java
Please commit your changes or stash them before you switch branches.
Unable to checkout 'abc123' in submodule path 'thingsboard-client-demo'
为什么会这样?
git submodule update 本质上是在子模块中执行 git checkout <commit>。Git 的保护机制会阻止 checkout 覆盖未提交的修改。
不同场景
场景 1未暂存的修改modified
cd thingsboard-client-demo
echo "test" >> file.txt # 修改文件,未 git add
cd ..
git submodule update
# ❌ 会报错,拒绝更新
场景 2已暂存但未提交staged
cd thingsboard-client-demo
echo "test" >> file.txt
git add file.txt # 已暂存,但未 commit
cd ..
git submodule update
# ❌ 仍然会报错,拒绝更新
场景 3新增的未跟踪文件untracked
cd thingsboard-client-demo
echo "test" > new-file.txt # 新文件,未 git add
cd ..
git submodule update
# ✅ 可以更新!因为新文件不会被覆盖
如何处理未提交的修改?
如果你确实需要更新子模块,有几个选择:
选项 1提交修改
cd thingsboard-client-demo
git add .
git commit -m "临时修改"
git push # 如果需要保存到远程
cd ..
git submodule update
选项 2暂存修改stash
cd thingsboard-client-demo
git stash # 暂存修改
cd ..
git submodule update
cd thingsboard-client-demo
git stash pop # 恢复修改
选项 3放弃修改
cd thingsboard-client-demo
git checkout . # 放弃所有修改
git clean -fd # 删除未跟踪的文件
cd ..
git submodule update
总结
你的修改是安全的Git 会保护你的工作:
有未提交修改时git submodule update 会拒绝执行
你的修改不会丢失
你需要先处理这些修改(提交、暂存或放弃)才能更新子模块
这是 Git 的安全机制,防止意外覆盖你的工作成果。