Git Stash 与本地 Commit 有什么区别?
对比项git stashgit commit(不 push)
主要用途临时切分支、临时处理中断稳定保存一个开发阶段
是否属于分支历史不属于分支提交历史属于当前分支历史
是否上传远端不会不会,除非执行git push
下次恢复git stash apply/popgit switch 分支名
恢复顺序依赖stash@{0}等动态序号通过分支和提交哈希固定定位
冲突风险应用到变化后的代码时容易冲突切回原分支通常直接恢复完整状态
未跟踪文件默认不保存,需要-ugit add后可以提交
查看改动相对不直观可通过git log/show/diff清晰查看
保存可靠性适合短期,不适合长期堆放更适合长期、稳定保存
是否方便撤销可以drop可用resetrevertrebase等处理

Git Stash

Git Stash:Temporary storage(临时保存),它更像是一个临时储物柜

Git 会做两件事情:

  1. 把当前修改打包成一个特殊的 Commit;
  2. 恢复工作区到干净状态。

基本操作:

// 暂存当前的更改文件 git stash push -u -m "临时保存布局修改" // 切换回分支需要恢复切换前的数据 git stash pop

git stash push -u -m "临时保存布局修改"作用:

  • 暂时保存已跟踪文件修改。
  • -u同时保存未跟踪文件。
  • 保存后清理工作区,方便切换分支。

恢复:

1.只恢复,不删除 stash

git stash apply stash@{0}

2. 恢复成功后删除 stash;发生冲突时通常保留。

git stash pop stash@{0}

优点:

  • 快速清空工作区。
  • 不会产生临时开发提交。
  • 适合修改只需要放几分钟或几小时的情况
  • 适合临时处理线上问题后马上回来继续

缺点:

  • stash 是整个仓库共用的列表,不真正绑定某个分支
  • stash@{0}会随着新增、删除 stash 而改变。
  • 多份 stash 堆在一起后容易恢复错
  • 默认不包含未跟踪文件。
  • 长时间保存后不容易知道每份 stash 的具体内容。
  • 在代码基线变化后恢复,容易出现冲突。
  • dropclear后恢复更麻烦,不适合作为长期备份。

如果某天切回的暂存不是上次最新的更改怎么办

整个恢复过程其实可以概括为四个步骤:

  1. 确认目标:通过git stash list找到需要恢复的 Stash,并确认其中包含自己需要的文件。
  2. 确认环境:检查当前分支、工作区状态以及 Stash 的创建基准,确保恢复不会引入不必要的冲突。
  3. 先备份再恢复:恢复之前,先将当前工作区再次stash一份作为保险,然后使用git stash apply恢复目标 Stash,而不是直接使用pop
  4. 恢复后验证:通过git diffgit stash list验证恢复结果,确认代码已恢复,同时原始 Stash 和备份 Stash 都仍然保留。
指令作用
git status --short --branch --untracked-files=all确认当前所在分支,并查看工作区所有修改(包括未跟踪文件)
git stash list --date=local查看所有 stash 及创建时间,确认目标 Stash
git show --stat --oneline --summary "stash@{0}"查看目标 Stash 包含哪些已跟踪文件,而不恢复代码
git stash show --include-untracked --name-status "stash@{0}"检查 stash 中的未跟踪文件
git diff --name-status a92c5xxx比较当前工作区与目标 stash
git log -5 --oneline --decorate查看当前分支最近几次提交,确认 HEAD 所在位置
git show -s --format="..." a92c5xxx查看 Stash 的元信息,包括它基于哪个提交创建
git stash push --include-untracked -m "自动备份:恢复 2026-07-21 19:04:51 前"在恢复旧 Stash 之前,先备份当前工作区的所有修改和未跟踪文件
git stash apply --index a92c527d9f680xxxx...根据指定哈希恢复昨天的 Stash,并恢复原来的暂存状态(Stage)
git diff --name-status a92c5xxx...恢复后再次比较;没有输出,说明已跟踪文件与目标 stash 完全一致
git stash list --date=local确认上次的原 stash 和今天的自动备份都还在

git commit ,但不push

基本操作:此时提交只存在本地,不会自动上传 GitLab/GitHub。

git add src/layout git commit -m "feat(layout): 保存导航布局改版进度"

切换到其他分支:

git switch master

下次切回继续做

git switch layout_test

优点:

  • 修改明确保存在layout_test分支上。
  • 提交哈希固定,不受 stash 序号变化影响。
  • 切回分支就是完整代码,不需要重新 apply/pop。
  • 可以清晰查看每次保存的内容:
git log --oneline git show 提交哈希
  • 可以继续修改、合并、拆分、撤销。
  • 在没有 push 前,可以使用commit --amend或交互式 rebase 整理提交。

缺点:

  • 会产生提交记录,临时保存过于频繁时历史可能零碎。
  • 后续推送前可能需要整理 WIP 提交。
  • 如果误提交.env.local、密码或本地配置,之后直接 push 会一起上传。
  • 只保存在本机,电脑或磁盘损坏仍可能丢失;它不是远程备份。