9、Git stash:暂存工作区、恢复暂存、查看暂存列表、删除暂存、应用场景

说实话,Git stash 是我日常开发中使用频率最高的命令之一。为什么?因为工作中你永远不知道什么时候会突然被打断——线上出 bug 了、领导要你切分支看个东西、同事让你帮忙 review 代码……这时候你手头的工作还没做完,commit 吧不合适,不 commit 吧又没法切换分支。嗯,stash 就是专门解决这个痛点的。

说白了,stash 就是一个「临时储物间」。你可以把当前工作区还没提交的改动全部塞进去,让工作区变得干干净净。等忙完别的事,再把这些改动取出来继续干。我刚开始用 Git 时总觉得这功能可有可无,直到有一次因为没 stash 直接切分支,导致改了一半的代码全乱了……从那以后,我再也不敢小看它了。

9.1 什么是 Git stash?

Git stash 会把当前工作区和暂存区的改动保存到一个栈结构中,然后恢复工作区到最近一次 commit 的状态。你想想看,这就像你正在写代码,突然有人敲门,你先把桌上的文件收进抽屉里,等客人走了再拿出来继续写。

stash 保存的内容包括:

  • 工作区中已修改但未暂存的文件
  • 暂存区中已添加但未提交的改动
  • 新创建但未跟踪的文件(需要加参数)

核心要点:stash 只保存未提交的改动。已经 commit 的内容不受影响。stash 是一个栈结构,后存进去的会先取出来。

9.2 基本操作命令

9.2.1 暂存工作区:git stash

最简单的用法就是直接执行:

# 暂存当前所有未提交的改动
git stash

# 暂存时加一条备注,方便识别
git stash save "正在开发登录模块,还没写完"

我个人习惯每次 stash 都加备注。为什么呢?因为 stash 多了之后,光看默认的 "WIP on master" 根本想不起来里面存的是什么。加个备注,回头一看就明白。

如果你想连新文件(未跟踪的文件)一起 stash:

# 包含未跟踪的文件
git stash -u
# 或者
git stash --include-untracked

我在项目中遇到过这种情况:新写了一个工具类文件,还没加到 Git 跟踪里,结果 stash 的时候默认不包含它。切分支回来发现新文件还在,但改过的代码没了……嗯,后来我就养成了加 -u 的习惯。

9.2.2 查看暂存列表:git stash list

存了几次之后,想看看都有哪些 stash:

git stash list

输出大概长这样:

stash@{0}: On master: 正在开发登录模块
stash@{1}: On master: 修复了空指针异常
stash@{2}: On feature/login: 添加表单验证

stash@{0} 是最新存进去的,stash@{2} 是最早的。你想想看,这就像一摞盘子,后放上去的盘子在最上面,先拿到的也是它。

9.2.3 恢复暂存:git stash pop 和 git stash apply

这两个命令容易搞混,我刚开始也分不清。咱们直接看区别:

命令 作用 是否删除 stash
git stash pop 恢复最近一次 stash,并删除它
git stash apply 恢复指定 stash,但不删除
# 恢复最近一次 stash,并删除
git stash pop

# 恢复指定 stash,但不删除
git stash apply stash@{1}

# 恢复最近一次 stash,但不删除
git stash apply

我个人习惯:如果只是临时切出去看一眼,回来就用 pop,一步到位。如果我想把同一个 stash 应用到多个分支,那就用 apply,不删留着继续用。

小技巧:恢复 stash 时如果发生冲突,Git 会提示你手动解决。解决完记得 add 然后 commit,或者继续 stash 操作。

9.2.4 删除暂存:git stash drop 和 git stash clear

有些 stash 用完了,或者发现不需要了,就得清理掉:

# 删除最近一次 stash
git stash drop

# 删除指定 stash
git stash drop stash@{2}

# 清空所有 stash
git stash clear

警告:git stash clear 会删除所有 stash,且不可恢复!我曾经手滑执行过一次,当时就懵了。建议只在确认所有 stash 都不需要了才用 clear,平时用 drop 一个个删更安全。

9.3 进阶用法

9.3.1 查看 stash 中的具体内容

有时候光看 stash list 的备注还不够,想看看里面到底改了哪些文件:

# 查看最近一次 stash 的改动详情
git stash show

# 查看详细 diff
git stash show -p

# 查看指定 stash
git stash show stash@{1} -p

这个命令我经常用。特别是 stash 了好几天之后,早就忘了里面改了什么。先 show 一下看看,确认没问题再 pop 出来。

9.3.2 从 stash 创建分支

如果你恢复 stash 时发现冲突太多,或者当前分支已经和 stash 时的状态差太远,可以直接从 stash 创建一个新分支:

git stash branch new-feature-branch stash@{0}

这个命令会:

  1. 基于 stash 时的 commit 创建新分支
  2. 把 stash 的内容应用到新分支
  3. 删除这个 stash

我在项目中遇到过这种情况:在 master 分支上 stash 了一些改动,结果 master 已经往前走了很多 commit,pop 出来冲突一大堆。这时候用 stash branch 就特别爽,直接在新分支上继续开发,互不干扰。

9.4 应用场景总结

说了这么多,到底什么时候该用 stash?我根据自己的经验整理了几个典型场景:

  • 场景一:临时切换分支——正在开发 feature A,突然要修线上 bug,stash 当前工作,切分支修 bug,修完切回来 pop 继续干。
  • 场景二:同步远程代码——git pull 之前发现有本地改动没提交,又不想为了 pull 专门 commit 一次,stash 一下再 pull,pull 完再 pop。
  • 场景三:实验性改动——想试试某个改法,但不确定好不好,先 stash 保存当前状态,试完不满意就 drop 掉,满意就 pop 回来。
  • 场景四:代码审查——同事让你帮忙看他的代码,但你手头有未完成的改动,stash 一下,看完再恢复。

一句话总结:stash 就是 Git 给你的「后悔药」和「暂停键」。工作被打断时,别慌,先 stash 再说。

9.5 知识体系图

下面这张图帮你理清 stash 的核心操作流程:

Git Stash 核心操作流程 工作区(未提交) 修改/新增的文件 暂存区(staged) git add 后的文件 Stash 栈 临时储物间 git add git stash git stash -u(包含未跟踪文件) git stash pop / apply 常用操作命令 git stash list git stash show -p git stash drop stash@{n} git stash save "备注" git stash branch 新分支名 git stash clear(慎用!)

从图上可以看得很清楚:stash 就像工作区和暂存区之间的一个「缓冲区」。你可以把东西存进去,也可以取出来,还可以查看里面有什么。操作路径很清晰,用熟了之后基本不用查文档。

我的建议:刚开始用 stash 时,多用 git stash list 和 git stash show 来确认状态。别一上来就 pop 或者 clear,容易翻车。等用顺手了,你会发现 stash 是 Git 里最贴心的功能之一。


公众号:蓝海资料掘金营,微信deep3321