Git Stash

git stash 的核心用法:暂存、恢复、部分暂存、从 stash 创建分支。

#type / howto #status / growing #tech / ops #resource / git

[!info] related notes

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

场景stashcommit
临时保存适合不适合(会污染历史)
长期保存不适合(栈结构)适合
分享给他人不适合适合
可追溯性低(栈中难以管理)高(完整历史)
推送到远程不能

实战场景

场景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 不可恢复:清空后无法找回
创建于 2026/5/27 更新于 2026/5/27