⭐git stash的作用:
- git stash作为临时保存工作目录中的修改,而不需要提交这些更改。
- 将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容。
- stash中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上。
⭐git stash作用范围:
- 工作区
- 暂存区
⭐git stash的使用情况:
- 切换分支但不想提交当前的工作
- 紧急修复 其它分支的bug
- 清理工作区以进行其他操作
- 测试不同的代码版本
⭐git stash的特点:
- 先进后出,后进先出
git stash的使用
前期准备:在dev分支中创建test1.txt,test2.txt文件,跟踪test1.txt文件(将test1.txt添加到暂存区)

⭐1. 保存当前修改
只保存工作区的修改
-
作用范围:
-
工作区中已跟踪文件的修改
-
暂存区中的修改
-
不包括:未跟踪的新文件
-
不包括:被 .gitignore 忽略的文件
保存未提交的修改(包括暂存区)
newfile.txt不会被保存
git stash
添加描述信息
git stash save "描述信息"
-

包含未跟踪的文件
-
作用范围:
-
所有已跟踪文件的修改
-
暂存区中的修改
-
未跟踪的新文件
-
不包括:被 .gitignore 忽略的文件
包含未跟踪的文件(新增的文件)
git stash -u
或 git stash --include-untracked
-

包含所有文件
-
作用范围:
-
所有已跟踪文件的修改
-
暂存区中的修改
-
未跟踪的新文件
-
被 .gitignore 忽略的文件
包含所有文件(包括被忽略的文件)
git stash -a
或 git stash --all
-
不同作用范围的对比表格
| 命令 | 工作区修改 | 暂存区修改 | 未跟踪文件 | 被忽略文件 |
|---|---|---|---|---|
git stash |
✅ | ✅ | ❌ | ❌ |
git stash -u |
✅ | ✅ | ✅ | ❌ |
git stash -a |
✅ | ✅ | ✅ | ✅ |
⭐2. 查看存储的stash
on dev:后的版本值为上一次提交的版本值
# 查看 stash 列表
git stash list
# 输出示例:
# stash@{0}: On main: 描述信息
# stash@{1}: On feature: 另一个修改

⭐3. 恢复存储的修改
bash
# 恢复最新的 stash(不删除 stash)
git stash apply
# 恢复指定的 stash
git stash apply stash@{n}
# 恢复并删除 stash(推荐)
git stash pop
# 恢复指定的 stash 并删除
git stash pop stash@{n}
情况一:在当前分支dev下取栈

情况二:切换到另一个分支dev2上取栈


⭐4. 删除stash
bash
# 删除最新的 stash
git stash drop
# 删除指定的 stash
git stash drop stash@{n}
# 删除所有 stash
git stash clear
常见的面试问题
⭐stash 和 commit 有什么区别?
- stash:临时保存,没有提交信息,适合临时切换
- commit:正式提交,有提交历史,适合版本记录
⭐stash 保存到哪里?
- stash 内容存储在 .git/refs/stash 和 .git/logs/refs/stash 中
⭐stash 会过期吗?
- 不会,stash 会一直存在直到你删除它
⭐如何恢复已删除的 stash?
- 可以通过 git fsck --unreachable 查找,然后使用 git show 恢复,但比较复杂