Git Stash
git stash 的核心用法:暂存、恢复、部分暂存、从 stash 创建分支。
#type / howto
#status / growing
#tech / ops
#resource / git
[!info] related notes
- 所属 MOC: Git MOC
- 相关命令: Git 撤销暂存, Git 撤销本地提交
Git Stash
一句话定义
stash 把当前工作区的修改临时保存到栈中,让工作区恢复干净状态。
基本操作
# 暂存当前修改(已跟踪文件)
git stash
# 暂存并添加描述
git stash push -m "正在开发用户模块,临时切分支"
# 暂存包括未跟踪文件
git stash -u
# 暂存包括忽略的文件
git stash -a
# 查看 stash 列表
git stash list
# stash@{0}: On feature/user: 正在开发用户模块
# stash@{1}: On feature/login: 临时保存
# 恢复最近的 stash(不删除 stash 记录)
git stash apply
# 恢复并删除 stash 记录
git stash pop
# 恢复指定的 stash
git stash apply stash@{2}
# 删除指定的 stash
git stash drop stash@{1}
# 清空所有 stash
git stash clear
部分暂存
# 只暂存指定文件
git stash push -m "只暂存配置文件" -- config.js .env
# 交互式选择要暂存的代码块
git stash push -p
# 会逐个询问每个修改的代码块是否要暂存
# y = 暂存这个块
# n = 跳过这个块
# s = 分割成更小的块
从 stash 创建分支
# 如果 pop 时有冲突,可以先创建分支
git stash branch new-feature-branch stash@{0}
# 这会:
# 1. 基于 stash 创建时的提交创建新分支
# 2. 在新分支上应用 stash
# 3. 如果成功,删除该 stash
查看 stash 内容
# 查看 stash 的摘要
git stash show
# 查看 stash 的完整 diff
git stash show -p
# 查看指定 stash
git stash show -p stash@{1}
stash vs commit
| 场景 | stash | commit |
|---|---|---|
| 临时保存 | 适合 | 不适合(会污染历史) |
| 长期保存 | 不适合(栈结构) | 适合 |
| 分享给他人 | 不适合 | 适合 |
| 可追溯性 | 低(栈中难以管理) | 高(完整历史) |
| 推送到远程 | 不能 | 能 |
实战场景
场景1:紧急切分支修 bug
# 正在 feature 分支开发,突然需要切到 main 修 bug
git stash push -m "feature 开发到一半"
git checkout main
# ... 修 bug 并提交 ...
git checkout feature
git stash pop
场景2:拉取远程更新时有冲突
# 本地有修改,想 pull 远程更新
git stash
git pull
git stash pop
# 如果 pop 有冲突,解决后继续
场景3:实验性修改
# 想尝试一个方案,但不想提交
# 写代码...
git stash push -m "方案A:改用 Redis 缓存"
# 换个方案...
git stash push -m "方案B:改用内存缓存"
# 对比两个方案
git stash show -p stash@{0} # 方案B
git stash show -p stash@{1} # 方案A
高级选项
# 保留索引(已 staged 的更改不暂存)
git stash push --keep-index -m "保留暂存区"
# 包含未跟踪文件但不包含忽略文件
git stash push -u --no-include-untracked
# stash 的提交信息支持模板
git stash push -m "$(date +%Y-%m-%d): 临时保存"
常见误区
stash不是commit:stash 是临时存储,不适合长期保存pop可能失败:如果有冲突,stash 不会被删除stash -u才包含新文件:默认只暂存已跟踪的文件- stash 是栈结构:
pop取的是最近的,不是任意的 stash clear不可恢复:清空后无法找回