Git 暂存改动有哪几种方式?3 种 stash 用法一次讲清

编程狮(w3cschool.cn) 2026-10-06 07:04:00 浏览数 (14)
反馈

Git 暂存改动三种方式对比

你正改到一半,突然要切去修一个紧急 bug,可手头的改动还没写完、提交又怕不完整——这种时候硬切分支只会让改动跟着跑或冲突报错。Git 暂存改动的核心答案是:用 git stash 把工作区和暂存区的改动先“收起来”存到栈里,等忙完再原样恢复,既不丢进度也不污染提交。本文基于 Git 2.4x 验证,把暂存全部改动、只暂存部分文件、以及暂存时带消息三种用法讲透,并附恢复与删除的踩坑清单。今天这篇文章,编程狮就把这块讲透。

先看结论

你的场景 该用的写法 一句话命令
全部改动先收起来 暂存工作区全部 git stash
只收其中几个文件 暂存指定文件 git stash push 文件
收起来还要好辨认 带消息的暂存 git stash save "改到一半"

💡 小提示:stash 是一个栈,后进先出。恢复时默认恢复最近一条,记不清就先用 git stash list 看编号。

一、Git 暂存改动到底在做什么

Git 暂存改动,本质是把“还没提交的修改”临时塞进一个叫 stash 的栈里,让工作区回到干净状态。这样你就能放心地分支切换或拉取更新,而不用为半成品强行提交。等腾出手来,再把改动弹回工作区。

⚠️ 注意:stash 只保存已被 Git 跟踪的文件改动。全新未 git add 过的文件默认不会被收进去,需要用 -u 参数才包含未跟踪文件。

先看最基础的 git stash 命令:

# 把所有已跟踪文件的改动收进 stash 栈
git stash

# 看看当前栈里有多少份暂存
git stash list

上面这段做的是:在当前分支执行 git stash,工作区立刻变干净,改动被压入栈顶。如果你还不熟悉分支切换的基础,可以先过一遍 Git 教程,把工作区与提交的关系铺平。

二、方案一:暂存工作区全部改动

这是最常用的写法,一条 git stash 把工作区与暂存区一起收起,适合“整个改动都要先让路”的场景,比如临时去修线上 bug。

# 收起全部改动,工作区回到 HEAD 状态
git stash

# 切去修 bug 的分支,干完再回来
git checkout hotfix
# ……修复并提交……
git checkout feature

# 恢复最近一次暂存并弹出栈
git stash pop

上面 git stash pop 会把栈顶改动恢复回工作区,同时把这条 stash 从栈里删掉。执行后你之前写到一半的内容就回来了,可以继续。

git stash 切换分支再恢复的改动暂存循环

💡 小提示:常用命令记不住时,Git 速查手册 把 stash 系列参数摊开对照着看更省心。

三、方案二:只暂存指定文件

有时候你改了 A、B 两个文件,只想先收 A,B 留着继续写。用 git stash push 后面跟具体路径,就能只暂存工作区里的一部分。

# 只收起 src/a.js 的改动,b.js 留在工作区
git stash push src/a.js -m "先收 a 的改动"

# 确认 b.js 还在
git status

这种写法适合“多任务并行、只想隔离某一块”的情况。参数 -m 还能给这条 stash 起个名字,后面 git stash list 里一眼能认出来。

四、方案三:带消息暂存与横向对比

前两种默认不写说明,栈里堆多了就分不清哪条是哪次。用 git stash save "说明" 或 git stash push -m "说明" 给每条加备注,是多人协作和长时间中断时的好习惯。

# 带消息地收起改动
git stash save "登录模块改到一半"

# 恢复指定编号而不是栈顶
git stash apply stash@{1}

# 不想恢复、直接丢弃某条
git stash drop stash@{1}

把三种写法摆在一起对比:

方案 适用场景 优点 代价
暂存全部 整个改动要让路 一条命令最省事 不能只隔离部分文件
暂存指定文件 只收其中几处 粒度可控 要多写文件路径
带消息暂存 暂存多、易混淆 事后好辨认 命令稍长

全部 / 指定文件 / 带消息三种暂存方式对比

五、踩坑清单

把最容易卡住的三点列出来,每条给现象、原因、修复:

  • 现象:stash pop 后报冲突。 原因:恢复时的文件和你切回来后的改动重叠了。修复:先 git stash drop 清掉旧 stash,手动合并冲突后再决定要不要重新 stash。
  • 现象:新文件没被收进去。 原因:默认只收已跟踪文件。修复:加 -u(git stash -u)把未跟踪文件也一起收。
  • 现象:list 里 stash 越来越多不敢动。 原因:只 stash 不 drop。修复:确认都恢复后,用 git stash clear 一次性清空,或逐条 git stash drop 精准删。

动手验证清单(照着做)

  • 前置安装:先确认本机已安装 Git,运行 git --version 检查版本;没装先下载安装并配好命令行。
  • 配置身份:若还没配置,用 git config --global user.name 和 git config --global user.email 配置提交身份。
  • 操作命令:照着方案一、方案二、方案三的 git stash 相关命令依次执行。
  • 预期结果(未在本机执行):git stash list 能看到刚才入栈的暂存项,git stash show -p 能看出具体改了哪些文件。
  • 运行验证:git status 检查工作区在 stash 之后是否变干净,pop 之后改动又回到工作区。
  • 失败处理:若 pop 时发生冲突,Git 不会自动丢弃暂存,用 git stash drop 手动清理已恢复的条目;不确定就先 git stash apply 只恢复不删除。
  • 修复补丁:暂存项误删可用 git fsck --unreachable 找回悬空对象再恢复;日常别在 stash 里堆太久,建议每完成一次临时切换就立刻 pop 或 drop,避免暂存项越积越多导致混淆。

总结

Git 暂存改动就是用 stash 栈把半成品“寄存”起来,让工作区随时能干净地切去别的分支。最常用的是 git stash 暂存全部;只想隔离某几个文件就用 git stash push 文件路径;暂存一多容易乱,记得用带消息的写法给每条加备注。恢复用 stash pop 或 apply,不要忘了用 drop / clear 清理,否则栈会越堆越厚。把这张对比表记牢,下次中途被打断就不会手忙脚乱。

要点带走:

  • 默认 stash 只收已跟踪文件,未跟踪要加 -u;
  • 只收部分改动用 git stash push 指定路径;
  • 带消息暂存便于事后辨认,恢复后记得清理栈。

下一步可以把分支管理与版本控制系统学一遍。

延伸学习

想把 Git 暂存与版本控制系统补齐,可以按这个顺序来:

  1. 刚开始接触版本控制,翻 Git 版本控制入门 看基础工作流;
  2. 想建立整体认知,Git 必备利器 把 Git 的定位讲得很清楚;
  3. 想边学边练,编程课程 里有配套图文微课,适合巩固。

常见问题

Q:git stash 和 git commit 有什么区别?

A:commit 会把改动正式记入历史,别人也能看到;stash 只是临时塞进本地栈,不生成提交、不影响分支历史。改动还没想好要不要留,就用 stash 寄存。

Q:stash pop 和 stash apply 该用哪个?

A:pop 恢复后顺手把这条 stash 删掉,apply 恢复但保留在栈里。确定只要这一份就用 pop,想先看看效果再决定就先用 apply。

Q:stash 的改动会丢吗?

A:只要不执行 drop 或 clear,stash 会一直留在本地栈里。误删前可以用 git stash list 确认编号,必要时用 git stash apply stash@{n} 再取回来。

0 人点赞