最稳妥的做法是用git stash push -m "说明"暂存未提交修改,再切换分支;若含未跟踪文件需加-u参数,切完后用git stash pop恢复,该机制轻量可逆且不污染提交历史。

git stash 保存当前未提交变更
没 git commit 的修改不能直接切分支,Git 会阻止你切换并报错:error: Your local changes to the following files would be overwritten by checkout。最稳妥的做法是先暂存(stash)这些改动。
执行:
git stash push -m "wip: move to new-branch"比裸
git stash 更好,因为带消息便于后续定位。如果只有工作区修改(没 git add),这条命令默认只 stash 已跟踪文件;若含新增未跟踪文件,需加 -u 参数:git stash push -u -m "..."。
创建并切换到新分支
stash 后就可以安全创建分支了。注意:新分支起点是当前 HEAD 所在提交,不是从 stash 创建——stash 是独立对象,不改变分支历史。
- 用
git switch -c new-branch(Git 2.23+ 推荐) - 或
git checkout -b new-branch(兼容旧版本) - 不要用
git branch new-branch && git checkout new-branch,多一步易出错
git stash pop 恢复代码到新分支
切过去后,用 git stash pop 把暂存的修改应用回来。它等价于 git stash apply && git stash drop,但要注意:如果恢复时发生冲突,pop 会中止并保留 stash,而 apply 不会自动删 stash,容易堆积。
常见坑:
– 如果之前用了 -u(含未跟踪文件),pop 会一并恢复它们
– 冲突时 Git 不会自动标记为 resolved,得手动 git add 冲突文件再 git stash drop
– 多次 stash 时,git stash pop 默认取最新一条;要指定某条,用 git stash pop stash@{1}
为什么不用 git cherry-pick 或 git merge?
因为 cherry-pick 需要已有 commit,merge 需要已存在的分支——而当前只有“脏工作区”,没 commit。硬要绕开 stash,比如先 git add . && git commit -m "tmp" 再切分支,会导致主分支上多一个临时 commit,后续还得 git reset --soft HEAD~1,风险更高、步骤更碎。
stash 是专为此类场景设计的机制,轻量、可逆、不污染提交历史。唯一要注意的是:stash 不跨仓库同步,别指望 git push 能把 stash 推上去。











