git stash 是临时储物箱:把未提交改动打包存起来,让工作区恢复干净,便于切分支处理紧急任务,事后再取回继续开发。

核心规则

  • 存什么:未提交的改动(已暂存 + 未暂存)
  • 默认不存:未跟踪的新文件、.gitignore 忽略的文件
  • 存完工作区会回到 HEAD 状态,可放心切分支
  • 数据存在 Git 的栈里(不是删除),随时可恢复
  • stash 是仓库级而非分支级,A 分支存的可在 B 分支恢复

常用命令

存改动

git stash                                # 存已暂存/未暂存(不含新文件)
git stash push -m "登录功能写一半"        # 推荐:加注释
git stash -u                             # 包含新建的未跟踪文件

查看

git stash list                           # 列出所有 stash(栈结构)
git stash show -p stash@{0}              # 查看某次 stash 的具体改动

恢复

git stash pop                            # 恢复最新一次并删除栈记录(最常用)
git stash apply                          # 恢复但保留栈记录(多次复用)
git stash pop stash@{1}                  # 恢复指定记录

删除

git stash drop stash@{1}                 # 删除指定记录
git stash clear                          # 清空所有(谨慎)

典型场景

# 1. feature 分支写一半,存档
git stash push -m "登录功能:完成账号校验"
 
# 2. 切到 main 修紧急 bug
git checkout main
git commit -am "fix: 修复首页崩溃"
 
# 3. 切回继续
git checkout feature
git stash pop

避坑

误区正解
以为 stash 会存新文件必须加 -u 才会包含 untracked
混淆 apply / popapply 保留栈记录,pop 弹出后即删
把 stash 当备份它是临时栈,长期保存请用 commit
切分支前未 stash 干净修改文件可能触发 checkout 阻断