| 对比项 | git stash | git commit(不 push) |
|---|---|---|
| 主要用途 | 临时切分支、临时处理中断 | 稳定保存一个开发阶段 |
| 是否属于分支历史 | 不属于分支提交历史 | 属于当前分支历史 |
| 是否上传远端 | 不会 | 不会,除非执行git push |
| 下次恢复 | git stash apply/pop | git switch 分支名 |
| 恢复顺序 | 依赖stash@{0}等动态序号 | 通过分支和提交哈希固定定位 |
| 冲突风险 | 应用到变化后的代码时容易冲突 | 切回原分支通常直接恢复完整状态 |
| 未跟踪文件 | 默认不保存,需要-u | git add后可以提交 |
| 查看改动 | 相对不直观 | 可通过git log/show/diff清晰查看 |
| 保存可靠性 | 适合短期,不适合长期堆放 | 更适合长期、稳定保存 |
| 是否方便撤销 | 可以drop | 可用reset、revert、rebase等处理 |
Git Stash
Git Stash:Temporary storage(临时保存),它更像是一个临时储物柜。
Git 会做两件事情:
- 把当前修改打包成一个特殊的 Commit;
- 恢复工作区到干净状态。
基本操作:
// 暂存当前的更改文件 git stash push -u -m "临时保存布局修改" // 切换回分支需要恢复切换前的数据 git stash popgit 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 的具体内容。
- 在代码基线变化后恢复,容易出现冲突。
drop或clear后恢复更麻烦,不适合作为长期备份。
如果某天切回的暂存不是上次最新的更改怎么办
整个恢复过程其实可以概括为四个步骤:
- 确认目标:通过
git stash list找到需要恢复的 Stash,并确认其中包含自己需要的文件。 - 确认环境:检查当前分支、工作区状态以及 Stash 的创建基准,确保恢复不会引入不必要的冲突。
- 先备份再恢复:恢复之前,先将当前工作区再次
stash一份作为保险,然后使用git stash apply恢复目标 Stash,而不是直接使用pop。 - 恢复后验证:通过
git diff和git 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 会一起上传。 - 只保存在本机,电脑或磁盘损坏仍可能丢失;它不是远程备份。