一、什么是git stash?
git stash的作用是将当前工作区和暂存区中尚未提交的修改保存到堆栈中,让工作区恢复到“干净状态”(与最近一次提交一致)。
核心价值
不会污染提交历史:stash保存在特殊的堆栈区域,不会出现在git log中
更精细的存储控制:可以选择只存储工作区变更或同时存储暂存区
多进度管理能力:支持保存多个工作进度并通过索引管理
二、基础用法
2.1 暂存当前修改
# 基本用法(保存所有未提交的修改) git stash # 带描述信息(推荐) git stash save "正在开发登录功能,未完成" # Git 2.13+ 简写 git stash push -m "修复登录页面的样式"
效果:将工作区和暂存区的修改保存到栈中,恢复工作目录到最后一次提交的状态。
2.2 查看暂存列表
git stash list stash@{0}: WIP on master: abc1234 添加新功能 stash@{1}: On feature: xyz5678 修复样式问题
2.3 恢复暂存的修改
# 恢复最近一次暂存(保留暂存记录) git stash apply # 恢复并删除暂存记录 git stash pop # 恢复指定暂存 git stash apply stash@{1} git stash pop stash@{2}
区别:apply恢复后保留暂存记录,pop恢复后删除暂存记录-36。
2.4 删除暂存记录
# 删除指定暂存 git stash drop stash@{1} # 清空所有暂存 git stash clear
三、实战场景
场景1:切换分支前保存工作
# 当前在feature分支工作,未完成但需要切换到master git stash save "feature分支未完成代码" # 切换到master处理紧急事务 git checkout master # 处理完紧急事务 # 切回feature分支恢复工作 git checkout feature git stash pop
场景2:误在错误分支上开发
# 错误:在master上开发了新功能 # 保存当前修改 git stash # 切换到正确的分支 git checkout feature # 恢复修改 git stash pop
场景3:多次stash的管理
# 第一次暂存 git stash save "功能A开发一半" # 第二次暂存(在功能A的基础上继续开发) git stash save "功能A继续开发" # 查看所有暂存 git stash list # 恢复第二次暂存 git stash pop stash@{0} # 恢复第一次暂存(需要先提交第二次的修改) git stash pop stash@{1}
四、高阶技巧
4.1 只暂存工作区(保留暂存区)
git stash --keep-index
使用场景:已经git add了部分文件准备提交,但工作区还有未完成的修改不想提交。
4.2 包含未跟踪文件
默认情况下,git stash不会保存未跟踪文件(如新创建但未git add的文件)。
# 包含未跟踪文件 git stash -u # 包含未跟踪文件并忽略.gitignore git stash -a
4.3 交互式暂存(只暂存部分修改)
# 交互式选择要暂存的修改块 git stash -p
Git会按hunk(块)展示修改,让你逐块选择:
y:收起当前块
n:跳过当前块
s:把当前块继续拆小
e:手动编辑当前块
4.4 基于stash创建分支
使用场景:stash的修改与当前分支差异较大,直接apply可能产生冲突。
4.5 查看stash内容
# 查看最近一次暂存的摘要 git stash show # 查看完整补丁内容 git stash show -p # 查看指定暂存 git stash show stash@{1}
五、常见踩坑提醒
| 问题 | 解决方案 |
| 新建文件未add,直接stash丢失 | 先git add,或用git stash -u |
| pop后产生冲突 | 手动解决冲突,或使用apply先预览 |
| stash太多难以管理 | 每次save时加描述信息 |
| 长期保留修改 | 建议创建分支并提交,而非依赖stash |
六、总结
git stash是Git工作流中不可或缺的工具-。掌握它,你就能在开发过程中随时切换上下文,而不必担心丢失未完成的工作。
核心命令速查:
| 操作 | 命令 |
| 暂存修改 | git stash / git stash save "描述" |
| 查看列表 | git stash list |
| 恢复(保留) | git stash apply |
| 恢复(删除) | git stash pop |
| 删除记录 | git stash drop |
| 清空所有 | git stash clear |
感谢浏览,希望这篇博客对你有所帮助~(^ - ^)~