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. 基于储藏时的提交创建新分支
  2. 切到新分支
  3. 成功应用后删掉该储藏记录

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 文章引用

📌 本文首发于微信公众号 【运维知识点滴】——专注运维实战干货,微信搜索“运维知识点滴”或扫下方二维码关注,更新不迷路。
📎 微信原文:07. 切分支怕丢改动?Git stash 暂存恢复保护现场

微信公众号【运维知识点滴】 微信小程序【A5单据合并&大试卷拆分转A4打印】
运维实战干货 · 关注追更 Word 转 PDF · 试卷/发票打印神器 · 免费
运维实战干货 · 关注追更 Word 转 PDF · 试卷/发票打印神器 · 免费

💡 小程序【A5单据合并&大试卷拆分转A4打印】是干嘛的? 一个 Word 转 PDF 的打印神器,专治“文档版式和打印机对不上”:

  • A3 试卷打不出来? 学校发的电子版试卷多是 A3,家用打印机只吃 A4——上传 Word 一键转换:可缩到一页 A4(页数不变),也可对半拆成两张 A4(1:1 原大、字更清晰),两种模式自选;
  • 版式不乱:真实渲染引擎原样转换、绝不重排内容,转出的 PDF 和原 Word 排版一致,公式/表格/图片不跑版;
  • 两张 A5 单据拼一张 A4:出租车票、火车票等报销凭证拼版后,一次打印、整齐粘贴;
  • 隐私省心:无需注册,转换结果留存 5 天、最多下载 5 次即自动删除,不留任何历史记录;
  • 微信扫码即用,免费、免安装,支持 doc / docx(≤50MB)。

上一篇:06. 给版本打上永久印记:Git 标签管理与发布实战