git stash临时保存工作区
通过git stash 可以灵活管理临时修改,保持工作区整洁,是多人协作或多任务切换时的常用工具,主要用于临时保存工作区和暂存区修改的命令,常用于以下场景:
(1)需要切换分支,但不想立即提交当前修改;
(2)临时拉取或合并远程代码,避免冲突;
(3)调试时保存中间状态,方便后续恢复。
注意事项:
(1)git stash 不保存已提交的内容(已在版本历史中);
(2)恢复储藏后,若有冲突需手动解决(类似合并冲突);
(3)储藏记录保存在本地仓库,不会推送到远程,需谨慎依赖长期储藏。
1、使用示例
比方说线上有紧急BUG需要修复,但当前我的一个新功能开发只进行到一半,都不一定能跑通,代码不能提交。这个时候,可以使用git stash将当前工作区暂存(隐藏起来),拉取最新代码,修改后提交修复bug。之后再回复自己的暂存区,继续开发。
# 1.当前工程开发一半,有文件hangar_box/stop_task_save.sh不能提交
git status
On branch master
Your branch is up to date with 'origin/master'.Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)modified: hangar_box/stop_task_save.shno changes added to commit (use "git add" and/or "git commit -a")# 2.git stash暂存工作区
$ git stash save "暂存区测试" -u # 注意:-u 加在最后
warning: LF will be replaced by CRLF in hangar_box/stop_task_save.sh.
The file will have its original line endings in your working directory
Saved working directory and index state On master: 暂存区测试
再次实行git status,显示工作区间干净# 3.拉取最新代码更新提交# 4.恢复工作区,如果跟步骤3文件冲突,相当于做了一次合并
git stash apply
2、基本用法
2.1、保存当前修改
保存当前修改。会将工作区和暂存区的所有修改(未跟踪文件默认不保存)存入一个临时 "储藏区",并将工作区恢复到上一次提交的干净状态。
git stash # 保存当前修改
git stash save "修复登录bug的临时修改" # 保存时添加说明
2.2、查看储藏列表
git stash list # 查看储藏列表
输出类似:
stash@{0}: On feature/login: 修复登录bug的临时修改
stash@{1}: WIP on main: 8a3b2c1 初始提交
stash@{n} 是储藏的索引,n 越小表示越新的储藏。
2.3、恢复储藏的修改
git stash apply 恢复最新的储藏(并保留储藏记录)
git stash apply stash@{1} # 恢复指定储藏,如:恢复第2条储藏
git stash pop # 相当于 apply + drop,恢复最新的储藏(并删除储藏记录)
2.4、删除储藏记录
git stash drop # 删除最新的储藏,不要轻易删储存,除非确定不用它了
git stash drop stash@{1} # 删除指定储藏
git stash clear # 删除所有储藏
3、进阶用法
3.1、保存未跟踪文件
默认不保存未跟踪文件(如新建的文件),需加 -u 或 --include-untracked:
git stash -u # 保存时支持对新建文件的添加
git stash save "修复登录bug的临时修改" -u # 保存时添加说明
3.2、保存所有文件(包括忽略的文件)
用 -a 或 --all 保存未跟踪文件和 .gitignore 中忽略的文件:
git stash -a
3.3、从储藏创建分支
若储藏的修改与当前分支冲突,可直接从储藏创建新分支:
git stash branch new-branch stash@{1}
4、恢复删除的存储
如果通过 git stash drop 或 git stash clear 误删了 stash 存储,只要没有执行过 git gc(Git 垃圾回收)清理未引用的对象,通常可以通过以下方法找回:
步骤 1:找到被删除的 stash 对应的 commit ID
Git 的所有 stash 本质上都是以 commit 对象的形式存储的,即使被删除,也能通过 reflog 找到记录。执行以下命令查看所有 stash 相关的操作记录:
git reflog show stash@{0} # 查看所有 stash 相关的操作记录
git reflog # 或查看所有引用的变更记录(包含 stash 的创建和删除)
输出结果中会包含类似这样的记录(重点关注 WIP on 相关的条目):
a1b2c3d (HEAD -> main) HEAD@{0}: stash: WIP on main: 8a3b2c1 初始提交
e4f5g6h HEAD@{1}: stash: WIP on feature/login: 修复登录bug的临时修改
其中 a1b2c3d、e4f5g6h 就是 stash 对应的 commit ID(完整 ID 可通过 git log -g 查看)。
步骤 2:恢复指定的 stash 记录
找到目标 stash 的 commit ID 后,有两种恢复方式:
方式 1:重新创建 stash 条目(推荐)
用 git stash apply 直接应用该 commit 的修改,同时会自动重新创建一个 stash 记录:
git stash apply e4f5g6h
方式 2:从 commit 创建新分支(适合有冲突的情况)
如果直接应用有冲突,可基于该 stash 创建新分支:
git branch recover-stash e4f5g6h
然后切换到新分支查看修改:
git checkout recover-stash
注意事项:
时效性:被删除的 stash 会作为 “未引用对象” 存在,默认情况下 Git 会在 30 天后通过 git gc 自动清理。如果删除时间过长且执行过垃圾回收,可能无法找回。
快速操作:发现误删后,应立即执行 git reflog 查找记录,避免执行 git gc 或等待自动清理。
验证内容:恢复后建议用 git diff 或 git status 确认找回的修改是否正确。
如果以上方法仍无法找回,可能是 stash 对应的 commit 已被彻底清理,这种情况下恢复难度极大,建议平时重要的临时修改尽量通过分支管理(而非长期依赖 stash)。