1、什么是 git stash
在日常开发中,经常遇到这种情况:正在一个分支上开发新功能,代码写到一半,突然需要切换到另一个分支去修复紧急 bug。但当前修改还不完整,不想提交,也不想丢弃。
git stash 就是为解决这个场景设计的——它能把当前工作区和暂存区的修改暂时”储藏”起来,让工作目录恢复干净状态,等你处理完其他事情后再恢复回来。
2、基本用法
储藏修改
git stash
或者带一条描述信息,方便之后查找:
git stash push -m "WIP: 正在重构用户模块"
注意:git stash 默认只储藏已跟踪文件的修改。如果要包含未跟踪的文件(新建的文件),需要加 -u 参数:
git stash -u
查看储藏列表
git stash list
输出类似:
stash@{0}: On feature-login: WIP: 正在重构用户模块
stash@{1}: On main: 临时保存配置修改
stash@{0} 是最近一次储藏,stash@{1} 是上一次,以此类推。它是一个栈结构,后进先出。
恢复储藏
恢复并保留储藏记录:
git stash apply
恢复最近一次储藏,但 stash 记录仍然保留在列表中。
恢复并删除储藏记录:
git stash pop
恢复最近一次储藏,同时从列表中删除该记录。这是最常用的方式。
恢复指定的储藏:
git stash apply stash@{1}
删除储藏
# 删除最近一次储藏
git stash drop
# 删除指定储藏
git stash drop stash@{1}
# 清空所有储藏
git stash clear
3、进阶技巧
只储藏部分文件
git stash push -m "只暂存 controller 修改" -- src/controllers/
-- 后面跟文件路径,可以指定只储藏某些文件。
以补丁模式交互式选择
git stash push -p
会逐个显示每个修改块(hunk),让你选择是否储藏。这在只想要暂存部分修改时非常有用。
从储藏创建新分支
git stash branch new-branch-name
这会基于储藏时的 commit 创建一个新分支,检出储藏时的修改,然后删除该 stash。当你储藏后发现这些修改更适合放在独立分支上时非常方便。
查看储藏的内容
# 查看储藏改动了哪些文件
git stash show
# 查看详细 diff
git stash show -p
# 查看指定储藏的 diff
git stash show -p stash@{1}
4、常见场景
场景一:紧急修复 bug
# 当前在 feature 分支,有未提交的修改
git stash
# 切换到 main 分支修复 bug
git checkout main
# ... 修复 bug,提交 ...
# 回到 feature 分支继续工作
git checkout feature
git stash pop
场景二:拉取远程代码前清理工作区
# 先储藏本地修改
git stash
# 拉取远程代码
git pull --rebase
# 恢复本地修改
git stash pop
如果有冲突,git stash pop 会提示你手动解决冲突,stash 记录不会被自动删除。
场景三:在多分支间移动未提交的修改
# 在错误的分支上做了修改
git stash
git checkout correct-branch
git stash pop
5、注意事项
git stash储藏的内容是全局的,不属于任何特定分支。所以在任意分支上执行git stash pop都能恢复。- 如果
pop时有冲突,stash 记录不会被自动删除,需要手动git stash drop清除。 - 不要依赖 stash 作为长期存储——它只是临时暂存。如果修改很重要,应该尽早提交或推到远程分支。
- stash 是基于 commit 的,储藏的内容不会在
git log中显示。
每天前进一小步,就是一个新的高度!