07. 切分支怕丢改动?Git stash 暂存恢复保护现场
「Git」系列已发布: 00. 改崩代码不敢回退?Git 版本控制 3 分钟救你狗命 | 01. Git 装完不会配?Windows/macOS/Linux 三端配置一次到位 | 02. Git 配置总踩坑?全局/仓库/SSH 密钥一次搞懂 | 03. add/commit/push 别再死记:Git 工作流核心概念实操 | 04. Git 分支管理:5 步彻底搞懂 branch 与 merge | 05. clone/fetch/pull/push 分不清?Git 远程协作实战 | 06. 给版本打上永久印记:Git 标签管理与发布实战 | 07. 切分支怕丢改动?Git stash 暂存恢复保护现场(本文)
改到一半要切分支,未提交的改动怎么办?stash 一键暂存、切换、恢复,还有 pop/apply/branch 等进阶玩法,现场永不丢失。
分支管理(第 04 篇)要熟练。准备一个带未提交修改的仓库跟着练就行。
一、为什么要 stash
这种场景太常见了:正在 feature 分支上改代码,突然要切到另一个分支处理紧急问题。但手上这摊子事儿还没干完——既不想提交半成品,又不能带着没提交的修改切分支。git stash就是干这个的:把工作目录和暂存区的修改先"收起来",让工作目录恢复干净,你放心切分支。完事儿之后再从储藏栈里把修改取出来继续干。
# 经典用法
git stash # 收起来
git checkout hotfix-branch # 切走修 bug
# ... 修完、提交 ...
git checkout feature-branch # 切回来
git stash pop # 恢复刚才的修改
1.1 stash 基础操作
1.1.1 储藏
# 储藏当前所有修改
git stash
# 等价写法
git stash push
# 加个描述——强烈推荐,不然过两天完全不记得里面是什么
git stash push -m "WIP: 用户认证模块重构——完成 60%"
# 连未跟踪文件一起储藏
git stash push -u
# 包括忽略的文件也储藏
git stash push -a
1.1.2 查看储藏列表
# 列出所有储藏
git stash list
# stash@{0}: On feature-login: WIP: 用户认证模块重构——完成 60%
# stash@{1}: On main: 修复首页样式问题
# stash@{2}: WIP on develop: a3f2b1c 添加日志模块
# 看某个储藏的大致内容
git stash show stash@{0}
# 看详细差异
git stash show -p stash@{0}
1.1.3 恢复储藏
# 恢复最近的,但保留储藏记录
git stash apply
# 恢复最近的,并删掉记录——最常用
git stash pop
# 恢复指定的
git stash apply stash@{1}
git stash pop stash@{1}
applyvspop:
| 命令 | 恢复修改 | 删除记录 |
|---|---|---|
git stash apply |
是 | 否 |
git stash pop |
是 | 成功恢复后删 |
1.2 进阶技巧
1.2.1 只储藏部分内容
# 只储藏指定文件
git stash push -m "仅储藏 config.py" -- src/config.py
# 只储藏某个目录
git stash push -m "仅储藏 src/api" -- src/api/
# 交互式选择要储藏哪些改动块
git stash push -p
1.2.2 从储藏创建分支
储藏的内容和当前分支有冲突,或者想在新分支上继续储藏的工作:
git stash branch feature-from-stash stash@{0}
这条命令会:
- 基于储藏时的提交创建新分支
- 切到新分支
- 成功应用后删掉该储藏记录
1.3 只储藏暂存区
# 只储藏已暂存的,未暂存的留在工作目录不动
git stash push --staged
# 验证
git status
1.3.1 删除储藏
# 删单个
git stash drop stash@{0}
# 清空所有
git stash clear
1.4 stash 与冲突
stash pop或stash apply碰上冲突的时候:
$ git stash pop
# Auto-merging src/config.py
# CONFLICT (content): Merge conflict in src/config.py
# 1. 手动解决冲突,删掉标记,保留正确代码
# 2. 标记已解决
git add src/config.py
# 3. 储藏记录还在,手动清理
git stash drop stash@{0}
几个要注意的点:
-
stash pop遇到冲突时不会自动删除储藏记录——这是安全设计,防止丢数据。 -
解决完确认无误后,一定手动
git stash drop清理。 -
冲突太复杂想放弃?
git reset --hard回退,然后git stash apply重新来过。
1.5 实际场景
1.5.1 中断式工作流
开发功能 A 时紧急修 Bug B:
# feature-a 分支上
git stash push -m "WIP: 功能A——订单导出"
# 切去修 bug
git checkout main
git checkout -b hotfix-bug-b
# 修、提交
git commit -am "fix: 修复订单状态计算错误"
# 合并 hotfix
git checkout main
git merge hotfix-bug-b
# 回来继续干功能 A
git checkout feature-a
git stash pop
1.5.2 拉取前暂存
推送前需要先拉远程更新,但本地有未提交修改:
git stash
git pull --rebase origin main
git stash pop
1.5.3 跨分支搬修改
在错的分支上写了代码:
git stash
git checkout correct-branch
git stash pop
1.5.4 保存实验性改动
快速试一个方案,不满意就恢复:
# 把当前状态存成检查点
git stash push -m "方案A——Redis 缓存"
# 试方案 B...
# B 不行,回到方案 A
git stash apply stash@{0}
# 想看所有实验方案?
git stash list
1.6 储藏习惯
1.6.1 描述信息不能省
# 别这样
git stash
# 这样——一周后看一眼就知道是什么
git stash push -m "WIP: 用户模块重构——Controller 层完成 80%"
1.6.2 定期清理
# 每月查一次
git stash list
# 清掉不需要的
git stash drop stash@{3}
1.6.3 stash 和 branch 的边界
stash 适合临时、短期的状态暂存。一项工作如果可能跨越多天、涉及多人协作,就该开 feature 分支正经开发。
| 条件 | 用 stash | 用 branch |
|---|---|---|
| 保存多久 | 几小时到 1-2 天 | 数天到数周 |
| 协作 | 个人临时切换 | 多人协作 |
| 历史追溯 | 不需要 | 需要 |
| Code Review | 不需要 | 需要 |
1.7 文章引用
- Git stash 官方文档:https://git-scm.com/docs/git-stash
- Pro Git - 储藏与清理:https://git-scm.com/book/zh/v2/Git-工具-储藏与清理
- Atlassian Git stash 教程:https://www.atlassian.com/git/tutorials/saving-changes/git-stash
📌 本文首发于微信公众号 【运维知识点滴】——专注运维实战干货,微信搜索“运维知识点滴”或扫下方二维码关注,更新不迷路。
📎 微信原文:07. 切分支怕丢改动?Git stash 暂存恢复保护现场
| 微信公众号【运维知识点滴】 | 微信小程序【A5单据合并&大试卷拆分转A4打印】 |
|---|---|
![]() |
![]() |
| 运维实战干货 · 关注追更 | Word 转 PDF · 试卷/发票打印神器 · 免费 |
💡 小程序【A5单据合并&大试卷拆分转A4打印】是干嘛的? 一个 Word 转 PDF 的打印神器,专治“文档版式和打印机对不上”:
- A3 试卷打不出来? 学校发的电子版试卷多是 A3,家用打印机只吃 A4——上传 Word 一键转换:可缩到一页 A4(页数不变),也可对半拆成两张 A4(1:1 原大、字更清晰),两种模式自选;
- 版式不乱:真实渲染引擎原样转换、绝不重排内容,转出的 PDF 和原 Word 排版一致,公式/表格/图片不跑版;
- 两张 A5 单据拼一张 A4:出租车票、火车票等报销凭证拼版后,一次打印、整齐粘贴;
- 隐私省心:无需注册,转换结果留存 5 天、最多下载 5 次即自动删除,不留任何历史记录;
- 微信扫码即用,免费、免安装,支持 doc / docx(≤50MB)。

