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

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.lryc.cn/news/623861.html

相关文章:

  • Win11 文件资源管理器预览窗格显示 XAML 文件内容教程
  • 【牛客刷题】成绩统计与发短信问题详解
  • 【Git系列】如何从 Git 中删除 .idea 目录
  • 【线程安全(二) Java EE】
  • 寻找数组的中心索引
  • 如果用ApiFox调用Kubernetes API,需要怎么设置证书?
  • Day16 多任务(2)
  • USB-A 3.2 和 USB-A 2.0的区别
  • Day27 装饰器
  • 从零配置YOLOv8环境:RTX 3060显卡完整指南
  • AI评测的科学之道:当Benchmark遇上统计学
  • 48.Seata认识、部署TC服务、微服务集成
  • [Responsive theme color] 动态更新 | CSS变量+JS操控 | 移动端-汉堡菜单 | 实现平滑滚动
  • 实现用户输入打断大模型流式输出:基于Vue与FastAPI的方案
  • GaussDB 数据库架构师修炼(十三)安全管理(5)-全密态数据库
  • 【每日一题】Day 6
  • 凸函数与损失函数
  • 开源数据发现平台:Amundsen Search Service 搜索服务
  • Python注解
  • 零墨云A4mini打印机设置电脑通过局域网络进行打印
  • C#对象的本地保存与序列化详解笔记
  • GitLab CI/CD、Jenkins与GitHub Actions在Kubernetes环境中的方案对比分析
  • 【Golang】:错误处理
  • 任务型Agent架构简介
  • Visual Studio Code 基础设置指南
  • 【R语言】R 语言中打印含有双引号的字符串时会出现 “\” 的原因解析
  • GaussDB常用术语缩写及释义
  • 路由器配置之模式
  • 4.Ansible自动化之-部署文件到主机
  • nodejs 中间件