游乐游手机版
首页/编程语言/文章详情

一文快速掌握Git暂存与stash功能全面指南

时间:2026-06-14 06:52
Git暂存区通过gitadd添加修改、gitrestore--staged取消暂存。stash临时保存未提交修改使工作区变干净,常用命令有gitstashpush-m添加备注、stashlist查看记录、stashpop恢复并删除、stashapply恢复不删除、stashdrop clear删除记录。默认不储藏未追踪文件,需加-u参数;建议同分支储藏同分支

Git 暂存基础操作

添加修改到暂存区

将修改后的文件加入暂存区,仅需一行 git add 命令。这一操作相当于告知 Git:“这些改动我准备保留在下一次提交中。”

一文详解Git的暂存与stash功能

# 添加单个文件
git add file.txt
# 添加所有修改的文件(不包括未跟踪的文件)
git add .
# 添加特定类型的文件(如所有.js文件)
git add *.js

功能:将修改内容存入暂存区,但不会立刻生成提交记录。 注意:未跟踪的新文件需先通过 git add 添加才能被暂存。

取消暂存

如果不小心把文件加入暂存区,可以使用 git restore --staged 轻松撤销:

# 取消单个文件的暂存
git restore --staged file.txt
# 取消所有文件的暂存
git restore --staged .

功能:将文件从暂存区移回工作目录,同时保留所有修改内容。

一、Git Stash 是什么?核心作用与场景

git stash(中文常翻译为储藏 / 暂存 / 暂存搁置)是 Git 中极其常用的命令,其核心作用为:

临时「储藏 / 保存」工作区 + 暂存区 中所有未提交的修改内容,让你的工作区和暂存区立刻恢复至「干净状态」(与最近一次 commit 完全一致),且不会丢失任何修改。

什么时候必须用 Git Stash?(典型应用场景)

以下是使用 git stash黄金场景,遇到这些情况直接使用即可,覆盖工作中 99% 的使用需求:

  1. 正在当前分支开发新功能或修复 Bug,突然需要切换到其他分支(例如 testrelease)处理紧急问题;
  2. 当前分支的代码改了一半、尚未完成、无法提交(提交不完整的代码会污染分支提交历史);
  3. 切换分支前,Git 强制要求「工作区干净」,否则会提示冲突或拒绝切换。

简单概括:想切分支、代码没写完、不愿提交 → 用 git stash 就对了!

二、Git Stash 基础核心命令(高频必会,优先掌握)

以下命令按「使用频率从高到低」排列,优先掌握前 5 个即可满足 90% 的开发需求,建议熟记并反复练习

1. 核心存储:git stash / git stash push

# 方式1:最简写法(推荐,工作中99%用它)
git stash
# 方式2:保存修改并添加描述信息
git stash save "描述信息"
# 方式3:完整写法(与方式1等价,push 可省略)
git stash push

功能:将「工作区 + 暂存区」的所有未提交修改临时存入 Git 的「储藏栈」,工作区瞬间变干净,所有修改被隐藏。

2. 带备注存储:git stash push -m "备注信息" 【强烈推荐】

git stash push -m "首页轮播图样式修改-未完成" 
git stash push -m "订单模块bug修复-待测试"

功能:与 git stash 功能一致,唯一区别是为本次储藏添加「自定义备注」

为什么强烈推荐?当你多次执行 git stash 后,会有多条储藏记录,带备注能一眼区分每个储藏对应的修改内容,避免混淆,确保后续恢复时不出错。

3. 查看所有储藏记录:git stash list

git stash list

功能:列出 Git 储藏栈中全部临时存储记录,输出格式如下:

stash@{0}: On dev: 搜索框样式优化-未完成 
stash@{1}: On dev: 筛选条单选失效问题修复-待测试 
  • 储藏栈采用「后进先出」结构:最新的记录排在最上方,编号为 stash@{0}
  • 每条记录包含:编号、所属分支、自定义备注。

4. 恢复储藏的修改:git stash pop 【最常用恢复方式】

# 恢复「最新的储藏记录」(stash@{0}),恢复后自动删除该记录
git stash pop 
# 恢复「指定编号」的储藏记录,恢复后自动删除该记录
git stash pop stash@{1}
  • 核心功能将储藏的修改恢复到当前工作区,恢复后代码与 stash 之前完全一致(工作区 + 暂存区的修改都会回来)。
  • 关键特性pop = 「恢复 + 删除」,恢复后该储藏记录从栈中移除,适合只需恢复一次的场景

5. 恢复储藏的修改:git stash apply 【备选恢复方式】

# 恢复最新的储藏记录(stash@{0}),恢复后「不删除」该记录
git stash apply
# 恢复指定编号的储藏记录,恢复后「不删除」该记录
git stash apply stash@{1}
  • 核心功能:与 git stash pop 几乎相同,都是将储藏的修改恢复到工作区。
  • 关键区别apply = 「只恢复,不删除」,恢复后该储藏记录仍然保存在栈中,适合需要多次恢复同一份修改的场景

重点区分:git stash pop vs git stash apply(必考必用)

这两个命令最容易混淆,记住核心差异只有一个是否删除储藏记录

git stash pop:恢复 + 删除记录 → 「一次性恢复」,用完即删,推荐日常使用;

git stash apply:只恢复,不删记录 → 「可重复恢复」,恢复后仍可再次恢复同一份修改,适合特殊场景。

三、Git Stash 进阶命令(必会,解决 80% 问题)

1. 删除指定储藏记录:git stash drop 编号

# 删除最新的储藏记录
git stash drop stash@{0}
# 删除指定编号的储藏记录
git stash drop stash@{2}

功能仅删除,不恢复。当存在无用的储藏记录,不想恢复只想清理时,使用此命令。

2. 删除所有储藏记录:git stash clear

git stash clear

功能:清空 Git 储藏栈中的所有储藏记录,慎用!执行后无法恢复被删除的记录,适用于确认所有储藏均已无用时的批量清理。

3. 查看储藏的「具体修改内容」:git stash show

# 查看最新储藏的「文件变更列表」(仅显示文件名+增删行数)
git stash show
# 查看最新储藏的「完整diff详情」(显示具体修改的代码行,推荐)
git stash show -p
# 查看指定编号储藏的完整diff详情
git stash show -p stash@{1}

功能:在恢复储藏前,先查看该储藏中具体修改了哪些代码,避免恢复错误内容。其中 -p 参数是核心(patch 补丁模式),可看到完整的代码修改。

4. 储藏「未追踪的新文件」:git stash -u / git stash --include-untracked

git stash -u
# 等价写法
git stash --include-untracked

重要说明默认的 git stash 只会储藏「已追踪的文件」(已被 Git 管理的文件,例如之前 commit 过的文件),对于工作区中新建的、从未被 git add 过的新文件(未追踪文件),默认不会被储藏。

加上 -u 参数后:会将「已追踪文件的修改 + 未追踪的新文件」一起储藏,工作区彻底干净,连新文件也被隐藏。

5. 储藏「忽略的文件」:git stash -a / git stash --all

git stash -a
# 等价写法
git stash --all

功能:最强的储藏命令,会储藏「已追踪文件修改 + 未追踪新文件 + .gitignore 中忽略的文件」(例如 node_modules、dist 等),适用于需要完全清空工作区的场景。日常开发较少使用,特殊场景(如切换分支前彻底清理)可考虑。

四、Git Stash 避坑指南 & 核心注意事项(重中之重,必看!)

这部分是最容易踩坑的地方,很多人用 stash 出问题,多是因为没注意这些规则。全部记住,能避开 99% 的坑!

✅ 注意 1:git stash 默认不会储藏的内容

默认执行 git stash 时,以下内容绝对不会被储藏,会原封不动留在工作区:

  • 从未被 Git 追踪过的文件(新建的、未执行过 git add 的文件);
  • .gitignore 忽略的文件(例如依赖包、打包产物、日志文件);
  • 已经提交到版本库的文件(只处理「未提交」的修改)。

✅ 解决办法:需要储藏未追踪文件请用 git stash -u,需要储藏忽略文件请用 git stash -a。

✅ 注意 2:stash 的恢复与「分支无关」,但有最佳实践

很多人误以为「在哪个分支 stash,就只能在那分支恢复」,这个认知是错误的!

真相:Git 的 stash 是「全局的」,储藏的是「文件的修改内容」,并不与分支绑定。你可以在 dev 分支 stash,然后切换到 test 分支恢复。

最佳实践:尽量在哪个分支储藏,就在哪个分支恢复!

原因:不同分支的代码差异可能很大,跨分支恢复 stash 大概率会触发「代码冲突」,增加不必要的麻烦,除非你明确知道两份代码无冲突。

✅ 注意 3:储藏记录的「生命周期」

储藏记录并非永久保存,属于「临时缓存」,以下操作会删除储藏记录:

  • 执行 git stash pop 编号:恢复后自动删除该记录;
  • 执行 git stash drop 编号:手动删除该记录;
  • 执行 git stash clear:删除所有记录;
  • 仓库被删除或迁移:储藏记录会随仓库消失(不会同步到远程仓库)。

✅ 注意 4:stash 无法储藏「空文件 / 空目录」

如果修改只是新建了一个空文件或空目录,执行 git stash 不会生效,Git 会提示「No local changes to save」,这是 Git 的默认行为,无需处理。

✅ 五、Git Stash 完整工作流程演示(工作中最常用,直接套用)

以下是一套完整的「标准流程」,遇到「代码没写完要切分支」的场景,按步骤执行即可,零错误、零踩坑,这是工作中最经典的用法:

场景:在 dev 分支开发新功能,写到一半,需要切换到 test 分支修紧急 Bug

# 步骤1:当前在 dev 分支,代码没写完,带备注储藏所有修改(推荐加 -m)
git stash push -m "dev-个人中心模块开发-未完成"
# 步骤2:查看储藏记录,确认储藏成功(可选,养成良好习惯)
git stash list
# 步骤3:切换到目标分支(此时工作区干净,切换无任何问题)
git checkout test
# 步骤4:在 test 分支修复 Bug,完成后正常提交
git add . 
git commit -m "test-修复订单支付失败bug"
# 步骤5:切回原分支 dev 
git checkout dev
# 步骤6:恢复之前储藏的未完成代码(推荐用 pop,恢复后删除记录)
git stash pop
# 步骤7:继续开发未完成的功能,代码与之前完全一致 ✔️

核心知识点速记

核心概念

  1. git stash:临时保存未提交修改,让工作区变干净,核心场景「代码没写完要切分支」;
  2. stash 是「栈结构」,后进先出,最新记录为 stash@{0}。

必会核心命令(按优先级排序)

  1. 储藏:git stash push -m "备注" (带备注,推荐首选)
  2. 查看:git stash list
  3. 恢复:git stash pop (恢复 + 删除,日常首选) / git stash apply(恢复不删除,备选)
  4. 删除:git stash drop 编号(删指定) / git stash clear(删全部)
  5. 查看修改:git stash show -p

两大避坑重点

  1. 默认不储藏「未追踪文件」和「忽略文件」,需要则加 -u / -a
  2. 尽量「同分支储藏、同分支恢复」,避免跨分支冲突。

核心区别速记

git stash pop → 恢复 + 删记录;git stash apply → 恢复不删记录。

来源:https://www.jb51.net/program/358253sjs.htm
上一篇Git忽略大小写重命名文件的解决方法 下一篇Git合并后回退操作完整指南与步骤详解
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
AWS RDS 数据库配置入门与基础操作指南
编程语言 · 2026-07-10

AWS RDS 数据库配置入门与基础操作指南

本文介绍了AWSRDS的基本概念与核心价值,即提供托管式关系数据库服务,简化运维。详细阐述了创建RDS实例的关键配置步骤,包括引擎选择、实例规格、存储与网络设置。最后,指导读者如何通过多种方式安全连接至数据库实例,并开始进行数据操作,为后续应用开发奠定基础。

PHP MVC中AJAX请求无法调用控制器方法的原因与解决方案
编程语言 · 2026-07-10

PHP MVC中AJAX请求无法调用控制器方法的原因与解决方案

PHPMVC中AJAX请求返回整页HTML的常见原因是控制器方法未正确输出响应或未终止执行,导致框架渲染视图。解决方法是在控制器中设置JSON响应头、输出数据后调用exit()明确终止,同时前端使用小写url和dataType: "json "。

Go语言手动构造rsa.PublicKey:正确初始化大整数模数N完整指南
编程语言 · 2026-07-10

Go语言手动构造rsa.PublicKey:正确初始化大整数模数N完整指南

手动构造RSA公钥时,模数N为*big Int类型,不能直接使用超长十进制字面量,需通过SetString或UnmarshalText方法解析字符串。公钥指数E可直接赋值,推荐65537。生产环境应使用rsa GenerateKey生成密钥对,避免手动构造引发的安全和格式错误。

Go语言实现HTTP定时轮询监控多URL响应时间与状态检测
编程语言 · 2026-07-10

Go语言实现HTTP定时轮询监控多URL响应时间与状态检测

使用Go语言实现HTTP定时轮询监控,通过按行分割与Tab解析URL列表,避免闭包陷阱和nil指针,每个URL启动独立ticker安全并发请求,并配置超时控制与资源关闭,确保响应时间与状态码准确检测。

Tkinter中Label标签在主循环动态更新的正确方法
编程语言 · 2026-07-10

Tkinter中Label标签在主循环动态更新的正确方法

在Tkinter中正确动态更新标签的方法:将标签组件的textvariable参数绑定到一个StringVar变量,然后通过调用该变量的 set()方法更新其值,界面会自动刷新。这样避免直接修改text属性或调用update()。此做法实现数据与界面的解耦,代码更简洁,响应更及时,避免手动同步的闪烁,推荐做法。