git stash用于临时保存未提交的修改,使工作区恢复至head状态,便于安全切换分支;默认不保存未跟踪文件,需加-u参数;恢复时可用pop(应用并删除)或apply(仅应用),冲突需手动解决。

不能直接切换,Git 会拒绝操作,除非你明确告诉它怎么处理未提交的修改。 这不是 bug,是保护机制 —— 防止工作区文件被目标分支同名文件覆盖或引发冲突。
git stash 是最常用且安全的保留方式
它把当前工作区和暂存区的全部修改“压栈”保存,同时让工作目录退回到 HEAD 状态,干净得像刚 git checkout 过一样。
-
git stash就够用;如果想加描述便于识别,用git stash push -m "wip: user login UI" - 切走后想恢复:先
git checkout回原分支,再git stash pop(应用并删掉这条 stash) - 只应用不删除用
git stash apply;查有哪些 stash 用git stash list - 注意:如果
git stash pop后出现冲突,Git 不会自动中止,而是留下冲突标记,需手动解决
git checkout -f 强制丢弃修改再切换
适合确认这些改动完全不需要、也不怕丢失的场景。它绕过检查,直接覆盖工作区文件为目标分支对应版本。
- 命令是
git checkout -f <branch-name></branch-name>,比如git checkout -f main - 执行后,所有未
add未commit的修改彻底消失,不可逆 - 比
git reset --hard更快,因为它不改暂存区,只重置工作区 - 常见误用:在 CI 脚本里无条件加
-f,结果把本地调试代码清空了
用临时分支保存修改再切换
当你希望这些修改本身就有意义、未来可能要基于它继续开发,而不是“暂存后马上取回”,临时分支更合适。
- 创建并跳转:
git checkout -b wip-login-flow - 提交当前修改:
git add . && git commit -m "WIP: login button styling" - 再切到其他分支干活,这个
wip-login-flow分支就完整保留了你的上下文 - 后续可
git rebase或git merge把它合入主线,而不是靠 stash 搬运
真正容易被忽略的是:stash 不会保存未跟踪(untracked)文件,除非加 -u 参数;而 git checkout -f 对 untracked 文件也无影响 —— 它们会原样留在工作区。需要统一处理时,得额外判断 git status --porcelain 输出。











