Git 中文手册

git stash 临时保存未提交的改动(含 stash 系列全解)

2026-09-06 约 3 分钟阅读

改到一半要切换分支、拉取代码、或处理紧急 bug,又不想提交半成品?git stash 能把工作区和暂存区的改动"藏起来",随时再取出。本文讲透 stash 的保存、恢复与清理。

场景:你正在改一个功能,突然需要切换到另一个分支去修一个紧急 bug,或者想 git pull 拉最新代码。但工作区的半成品改动不提交就无法干净切换——这时 git stash 登场。

一句话理解

git stash工作区 + 暂存区的改动打包收进一个「暂存栈」,让工作区回到干净状态;需要时再原样取回。相当于代码的「临时寄存」。

保存改动

git stash                # 保存所有未提交改动
git stash -u             # 连同未跟踪的新文件一起保存(默认不存未跟踪文件)
git stash save "说明文字" # 带备注保存,便于区分

执行后 git status 变干净,可以放心切分支 / pull。

查看已保存的 stash

git stash list

输出类似:

stash@{0}: On feature/login: 登录模块半成品
stash@{1}: On main: 样式调整

恢复改动

git stash pop            # 取出最近一个并删除它
git stash apply          # 取出最近一个但保留(可重复用)
git stash apply stash@{1} # 取出指定那一个

恢复时如果和目标分支的改动冲突,Git 会提示冲突,手动解决即可。

清理与进阶

git stash drop stash@{1}   # 删除指定 stash
git stash clear            # 清空所有 stash(慎用)
git stash show -p stash@{0} # 查看某个 stash 的具体 diff

分支上取出:如果你把 stash 从分支 A 存、切到分支 B,git stash pop 会把改动应用到当前所在的分支 B——所以要在正确的分支上取出。

完整实战示例

# 1. 在 feature 分支改了代码,工作区不干净
git status                      # 有未提交改动

# 2. 紧急要切到 main 修 bug
git stash -u                    # 连同新文件一起暂存

# 3. 切到 main,修完 bug 后回来
git switch main
# ... 修复并提交 ...
git switch feature

# 4. 把改动取回来继续
git stash pop

常见问题

  • stash pop 后冲突:说明取出时与当前分支改动重叠,按冲突解决流程处理,stash 不会自动丢(除非你 drop)。
  • stash 了但忘了在哪个分支git stash list 每条会标注来源分支名(On xxx)。
  • 想只暂存部分文件:用 git stash push -m "备注" -- 具体文件

一句话速记

git stash 存 → git stash list 看 → git stash pop 取。

?

常见问题 FAQ

git stash 和 git commit 有什么区别?
commit 会永久记录一个提交点(进入历史);stash 只是把改动暂存到一个临时栈里,不会产生提交记录,适合"临时放下、稍后继续"的半成品。
git stash pop 和 git stash apply 区别?
pop 会取出最近一个 stash 并从栈中删除它;apply 只取出但不删除,可多次应用。想保留备份用 apply,用完想清理用 pop。
stash 的改动会丢吗?重启电脑还在吗?
不丢。stash 存在本地仓库的 stash 栈中,重启、切分支都还在。可用 git stash list 查看,直到你主动 pop/apply 或 drop 清理。
我忘了 stash 了什么,怎么看里面的改动?
用 git stash show -p stash@{0} 查看最近一个 stash 的具体改动;想对比列表用 git stash list 查看所有 stash 记录。