Git Stash 暂存的正确姿势
正在写功能,突然要切分支去修线上 bug,但手头代码还不能提交。git stash 就是干这个的。
它把工作区和暂存区的改动打包存起来,留下一个干净的工作区。
一、基础三连
git stash push -m "feat: 用户登录改到一半" # 存
git stash list # 看
git stash pop # 取回并删除这条 stash
pop 和 apply 的区别只有一条:
pop:取回后删掉这条记录apply:取回但保留记录(想应用到多个分支时用)
二、默认不存未跟踪文件
新建的文件默认不会被 stash,切分支后它还留在工作区里,很容易被误提交。
git stash push -u -m "wip" # 连未跟踪文件一起存
git stash push -a -m "wip" # 连 .gitignore 忽略的也一起存(少用)
三、只暂存一部分
git stash push -m "wip" src/login.ts src/api.ts # 指定文件
git stash push -p -m "wip" # 交互式挑 hunk
-p 是妙招:改了两个不相关的功能,可以把其中一半先存起来,另一半留在工作区提交。
四、按需恢复
git stash list
# stash@{0}: On main: wip
# stash@{1}: On feature: feat: 用户登录改到一半
git stash show -p stash@{1} # 先看一眼内容再决定
git stash pop stash@{1} # 取回指定那条
git stash drop stash@{1} # 不要了就丢
git stash clear # 全清,慎用
五、恢复时冲突了
stash 取回本质是三方合并,基线变了就会冲突,表现和普通 merge 一样:文件里留下冲突标记。
处理完标记后:
git add .
# 注意:pop 冲突后 stash 记录不会自动删除
git stash drop
如果搞乱了想放弃这次恢复:
git checkout -- .
六、误删 stash 还能救回来
stash 存在 reflog 里,掉的不一定是真没了:
git fsck --unreachable | grep commit
git show <commit-id> # 确认内容
git stash apply <commit-id>
七、几个实际场景
切分支修 bug:git stash push -u -m "wip" → 切分支修复 → 回来 git stash pop。
想带到另一个分支:在原分支 git stash push -u,切到目标分支 git stash apply,用完 git stash drop。stash 是全仓库共享的,跟分支无关。
日常少用 stash:如果改动要留很久,开个 WIP 分支提交上去更可靠——stash 在误操作和 IDE 切换面前太脆了。