<p>Git 切换分支被拒绝是因本地修改会覆盖目标分支文件,需用 git stash 临时保存或 git checkout -- 丢弃修改;IDEA 的 Local History 可找回未提交代码。</p>

git checkout 切换分支被拒绝:提示“your local changes would be overwritten”
这是 Git 的保护机制,不是 bug。它在告诉你:目标分支的某个文件,在你当前工作区里已被修改,而目标分支的该文件版本和你本地不一致,强行切换会覆盖你的改动。
此时不能硬切(比如 git checkout -f),否则未提交的代码直接消失——IDEA 里选 Force Checkout 也是同理,风险极高。
- 运行
git status确认哪些文件被修改、是否已git add - 注意区分:已暂存(staged)和未暂存(unstaged)的修改都会阻断切换
- 如果只是改了几行调试代码,又不想留记录,可先
git checkout -- <file>丢弃单个文件;批量丢弃用git checkout .
git stash 是最常用也最安全的临时保存方案
git stash 把工作区 + 暂存区的全部变更打包存到栈顶,清空当前工作区,让你能干净切换分支。它不依赖分支历史,也不写入 commit log,纯属本地操作。
- 保存时加描述更易识别:
git stash push -m "fix login timeout on iOS" - 查看所有暂存:
git stash list,输出类似stash@{0}: On dev: fix login timeout... - 恢复最近一次:
git stash pop(恢复后自动删掉该 stash) - 只恢复不删除(方便多次应用):
git stash apply - 恢复指定某次:
git stash apply stash@{2}
注意:git stash pop 在目标分支上执行时,若文件已被修改过,可能触发冲突,需手动解决——这不是 stash 失效,而是 Git 正常合并逻辑。
IDEA 图形界面中 stash / unstash 的实际操作要点
右键项目 → Git → Stash Changes 看似简单,但容易忽略两个关键细节:
- 勾选
Include untracked files:否则新创建但未git add的文件不会被暂存,切换后就没了 - 还原时别点错分支:Apply Stash 前务必确认当前所在分支是你想恢复代码的那个分支(比如从
master切回feature/login后再操作) - IDEA 的
Unstash Changes默认只显示最近一条,要查全部得进VCS → Git → Show Stashed Changes
Terminal 里用命令更可控,图形界面适合快速操作,但别完全依赖它隐藏的默认行为。
误操作后怎么找回“消失”的未提交代码?
真丢了?先别 panic。Git 本身不记录未提交内容,但 IDEA 有本地历史(Local History),这是最后防线:
- 右键文件或目录 →
Local History → Show History - 能看到每分钟自动保存的快照,包括未
git add的修改 - 选中某条记录 →
Revert即可恢复(仅限该文件) - 这个功能默认开启,但只保留最近 5 天(可在
Settings → Version Control → Local History调整)
真正危险的是:既没 stash,也没开 IDEA 本地历史,还用了 git reset --hard 或 Force Checkout —— 那些代码就真的不在任何地方了。


















