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

一文快速掌握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合并后回退操作完整指南与步骤详解
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

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

同类最新

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

更多
Git删除远程分支与本地分支的详细操作步骤
编程语言 · 2026-06-14

Git删除远程分支与本地分支的详细操作步骤

删除远程分支用`gitpushorigin--delete`,本地分支根据是否合并选`gitbranch-d`安全删除或`-D`强制删除。现代编辑器也提供可视化删除。清理前需确认分支状态,避免误删重要更改。

Git合并后回退操作完整指南与步骤详解
编程语言 · 2026-06-14

Git合并后回退操作完整指南与步骤详解

在Git合并后遇问题时,可使用三种方案回退:完成合并并提交;放弃合并并回退到合并前状态;完全重置到远程状态。关键命令包括gitmerge--abort、gitreset--hard和gitreflog。建议养成gitpull前先gitfetch、使用--no-commit等习惯,必要时启用rebase策略。

Git忽略大小写重命名文件的解决方法
编程语言 · 2026-06-14

Git忽略大小写重命名文件的解决方法

Git默认忽略文件名大小写,需设置`core ignorecasefalse`开启大小写敏感。当修改文件名大小写后,先执行`gitrm--cached`删除旧文件的暂存记录,再执行`gitadd`添加新文件,最后提交即可完成重命名。这样能避免远程仓库中出现重复文件,确保大小写变更被正确追踪。

微信小程序input只读属性readonly失效原因
编程语言 · 2026-06-14

微信小程序input只读属性readonly失效原因

微信小程序中input的readonly属性仅限制编辑,仍可聚焦并触发事件,无法完全禁止用户交互。建议改用disabled属性彻底禁用、阻止事件传播或设置CSS的pointer-events:none解决。纯展示场景推荐直接使用view组件,并根据业务场景选择合适方案。