当前位置: 首页 > backend >正文

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)。

http://www.xdnf.cn/news/18011.html

相关文章:

  • Talk2BEV论文速读
  • Next.js跟React关系(Next.js是基于React库的全栈框架)(文件系统路由、服务端渲染SSR、静态生成SSG、增量静态再生ISR、API路由)
  • 【Python】-- 机器学习项目 - 基于KNN算法的鸢尾花分类
  • 基于飞算JavaAI实现布隆过滤器防止缓存穿透:原理、实践与全流程解析
  • HTTP0.9/1.0/1.1/2.0
  • 免费照片压缩网站
  • Android原生(Kotlin)与Flutter混合开发 - 设备控制与状态同步解决方案
  • Visual Studio Code 基础设置指南
  • C++ 特殊类设计与单例模式解析
  • 云计算-K8s 实战:Pod、安全上下文、HPA 、CRD、网络策略、亲和性等功能配置实操指南
  • 天地图开发的优点
  • Leaflet赋能:WebGIS视角下的省域区县天气可视化实战攻略
  • PostgreSQL——用户管理
  • Dify 从入门到精通(第 38/100 篇):Dify 的实时协作功能
  • PIDGen!DecodeProdKey函数分析之四个断点
  • 优雅草星云物联网项目私有化定制技术解析:RS485接口与工业通讯协议-优雅草卓伊凡
  • 原码表示法、反码表示法、移码表示法、补码表示法
  • C语言基础:(十五)深入理解指针(5)
  • 牛 CDR3 单抗:抗病毒领域的 “纳米级精准导弹”
  • 类与类加载器
  • 8.16打卡 DAY43 复习日
  • 【遥感图像技术系列】遥感图像风格迁移的研究进展一览
  • Mybatis-3自己实现MyBatis底层机制
  • 【leetcode】13. 罗马数字转整数
  • python学习DAY43打卡
  • MySQL 的 DDL / DML / DQL / DCL 做一次系统梳理:概念区别→常用语法→特点与注意点→实战小例子→常见面试/坑点速记
  • redis的key过期删除策略和内存淘汰机制
  • JavaWeb开发_Day14
  • Python虚拟环境与包管理工具(uv、Conda)
  • 发文暴论!线性注意力is all you need!