在日常 Git 开发流程中,我们经常会遇到这样的场景:正在某个分支上开发新功能,代码还没写完,突然需要切换分支修复紧急 Bug,或者拉取远程最新代码、合并分支------但未完成的代码既不想提交(提交半成品会污染提交历史),也不想删除。这时候,git stash 就是解决这类问题的「救星」。
本文将从核心概念、基础用法、进阶技巧、注意事项到实战场景,全面讲解 git stash 的使用方式,帮你优雅处理临时代码暂存的问题。
一、什么是 Git Stash?
git stash(译为「储藏/暂存」)是 Git 提供的核心命令,用于将工作区和暂存区的未提交修改(已跟踪文件)临时保存到一个独立的「stash 栈」中,同时将工作区恢复到当前提交(HEAD)的干净状态。
简单来说,stash 就像一个「临时代码抽屉」:你可以把没写完的代码暂时放进去,等处理完其他任务后,再从抽屉里把代码取出来继续开发。
核心特性
- 不影响提交历史,仅操作工作区/暂存区;
- stash 记录是本地独有的,不会推送到远程仓库;
- 支持多份 stash 记录管理(栈结构,先进后出);
- 可灵活恢复、删除、查看 stash 内容。
二、Git Stash 基础用法
先掌握最常用的基础命令,覆盖 80% 的使用场景。
1. 保存当前修改(基础版)
git stash
这是最基础的用法,执行后会:
- 将工作区(已跟踪文件)和暂存区的修改保存到 stash 栈;
- 工作区恢复为 HEAD 提交的干净状态(未跟踪文件会保留,除非显式指定);
- Git 会自动为 stash 生成默认备注,格式为
WIP on <分支名>: <提交哈希> <提交信息>。
2. 查看 stash 列表
保存多份 stash 后,可通过以下命令查看所有记录:
git stash list
输出示例:
csharp
stash@{0}: WIP on feature/user: a1b2c3d add user api
stash@{1}: WIP on master: f4e5d6b fix login bug
其中 stash@{n} 是 stash 的唯一标识(n 从 0 开始,0 是最新的 stash)。
3. 恢复 stash 记录
恢复 stash 有两种核心方式,区别在于是否保留 stash 记录:
方式 1:apply(恢复但保留 stash 记录)
perl
# 恢复最新的 stash(stash@{0})
git stash apply
# 恢复指定的 stash 记录
git stash apply stash@{1}
适合需要多次复用同一份 stash 的场景(比如多分支复用)。
方式 2:pop(恢复并删除 stash 记录)
perl
# 恢复最新 stash 并从栈中删除
git stash pop
# 恢复指定 stash 并删除
git stash pop stash@{1}
这是最常用的方式(用完即删,避免 stash 栈冗余)。
4. 删除 stash 记录
如果不需要某份 stash 了,可手动删除:
perl
# 删除指定 stash
git stash drop stash@{1}
# 删除最新的 stash
git stash drop
# 清空所有 stash 记录(谨慎使用)
git stash clear
三、Git Stash 进阶技巧
掌握以下技巧,应对更复杂的场景。
1. 给 stash 加备注(推荐)
默认的 stash 备注不够直观,可通过 -m 参数自定义备注,方便后续识别:
perl
# 新版 Git(2.13+)推荐用 push(save 已过时)
git stash push -m "feature/user: 完成用户列表接口,未测试"
# 旧版 Git 可用 save
git stash save "feature/user: 完成用户列表接口,未测试"
执行 git stash list 后会看到清晰的备注:
bash
stash@{0}: On feature/user: feature/user: 完成用户列表接口,未测试
2. 暂存未跟踪/忽略的文件
默认情况下,git stash 只保存已跟踪文件 (被 Git 管理的文件),未跟踪文件(新建但未 git add 的文件)和忽略文件(.gitignore 中的文件)不会被保存。可通过参数扩展范围:
| 命令 | 作用 |
|---|---|
git stash push -u / git stash push --include-untracked |
包含未跟踪文件 |
git stash push -a / git stash push --all |
包含未跟踪文件 + 忽略文件 |
示例:
perl
# 保存已跟踪 + 未跟踪文件
git stash push -u -m "包含新建的 utils.js 文件"
3. 只暂存暂存区的修改
如果只想保存「已 git add 到暂存区」的修改,忽略工作区的未暂存修改,可使用 --staged 参数:
perl
git stash push --staged -m "仅暂存区:修复订单计算逻辑"
4. 查看 stash 的具体修改内容
想知道某份 stash 改了哪些内容,无需恢复,直接查看:
perl
# 查看最新 stash 的文件列表(简略版)
git stash show
# 查看最新 stash 的具体代码改动(详细版,推荐)
git stash show -p
# 查看指定 stash 的详细改动
git stash show -p stash@{1}
输出示例(详细版):
diff
diff --git a/src/user.js b/src/user.js
index 1234567..89abcde 100644
--- a/src/user.js
+++ b/src/user.js
@@ -10,6 +10,8 @@ export const getUserList = async () => {
const res = await axios.get('/api/user');
+ // 新增:过滤禁用用户
+ return res.data.filter(item => !item.disabled);
return res.data;
};
5. 从 stash 创建新分支(解决冲突)
如果恢复 stash 时和当前分支的代码冲突(比如 stash 后分支有新提交,修改了同一行代码),直接 apply/pop 会触发冲突。此时可通过 git stash branch 创建新分支,自动应用 stash 并避免冲突:
bash
# 基于最新 stash 创建新分支 feature/user-fix
git stash branch feature/user-fix
# 基于指定 stash 创建分支
git stash branch feature/user-fix stash@{1}
执行后会:
- 创建并切换到新分支;
- 将指定 stash 应用到新分支;
- 若应用成功,自动删除该 stash 记录。
四、注意事项
- stash 不跨仓库:stash 是本地仓库的临时存储,切换到其他本地仓库无法访问;
- 冲突处理 :恢复 stash 时若出现冲突,需手动解决(和合并冲突操作一致),解决后执行
git add <冲突文件>,再通过git stash drop删除对应的 stash 记录; - 避免滥用 :不要长期保留无用的 stash,定期用
git stash list清理,防止栈混乱; - 跨分支恢复需谨慎:stash 是全局的(不绑定分支),但跨分支恢复可能因代码结构差异导致冲突,建议尽量在原分支恢复;
- 未跟踪文件的坑 :默认
git stash不保存未跟踪文件,若切换分支后删除了这些文件,恢复分支后文件会丢失------务必用-u参数保存未跟踪文件。
五、实战场景示例
场景 1:紧急修复 Bug
需求:正在 feature/pay 分支开发支付功能(代码未完成),需要切换到 master 分支修复紧急 Bug。
步骤:
perl
# 1. 查看当前修改(可选)
git status
# 2. 暂存当前修改,添加备注
git stash push -m "feature/pay: 开发微信支付回调,未完成"
# 3. 切换到 master 分支
git checkout master
# 4. 拉取远程最新代码(可选)
git pull origin master
# 5. 修复 Bug,提交代码
git add <修复文件>
git commit -m "fix: 修复支付回调参数错误问题"
git push origin master
# 6. 切回 feature/pay 分支,恢复暂存的代码
git checkout feature/pay
git stash pop
# 7. 继续开发支付功能...
场景 2:解决 stash 冲突
问题:stash 后,分支有新提交,恢复 stash 时出现冲突。
步骤:
perl
# 1. 尝试恢复 stash,触发冲突
git stash pop
# 2. 查看冲突文件
git status
# 3. 打开冲突文件,手动解决冲突(标记为 <<<<<<< HEAD、=======、>>>>>>> stash@{0})
# 4. 解决后,标记为已解决
git add <冲突文件>
# 5. 删除已恢复的 stash 记录(冲突时 pop 不会自动删除)
git stash drop stash@{0}
# 6. 继续开发...
六、总结
git stash 是处理临时代码暂存的高效工具,核心价值在于「不提交半成品,也不丢失修改」。掌握以下核心用法,足以应对绝大多数场景:
- 保存:
git stash push -m "备注"(推荐加-u保存未跟踪文件); - 查看:
git stash list/git stash show -p; - 恢复:
git stash pop(用完即删)/git stash apply(保留记录); - 删除:
git stash drop/git stash clear。
合理使用 git stash 能让你的 Git 操作更规范,避免提交历史混乱,同时提升开发效率。记住:stash 是本地的,重要的临时修改建议及时整理,不要长期堆积!