71 lines
2.2 KiB
Markdown
71 lines
2.2 KiB
Markdown
|
|
实际行为
|
|||
|
|
当你在子模块有未提交的修改时执行 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 的安全机制,防止意外覆盖你的工作成果。
|