Git stash 暂存后别忘了清理

FreeGuideOnline 最新 2026-07-05

什么是 Git Stash?为什么需要“清理”?

git stash 是 Git 提供的一个非常实用的命令,它可以让你暂时保存当前工作目录中的修改(包括已跟踪文件的更改和暂存区的内容),并将工作目录恢复到一个干净的状态,以便你可以切换到其他分支、拉取最新代码或进行其他操作。你可以把 stash 理解为一个“草稿箱”或“临时保存区”,方便你在任务中断时快速保存现场。

然而,正因为 stash 操作太方便了,很多开发者会习惯性地执行 git stashgit stash pop,却忽略了对 stash 列表的维护。久而久之,stash 堆栈中会堆积大量无用或已经过期的临时保存记录,这不仅会让 git stash list 的输出变得混乱,还可能占用不必要的存储空间,甚至在某些场景下引起混淆——比如你不小心应用了一个错误的 stash。

因此,“暂存后别忘了清理” 是一条非常重要的 Git 使用原则。本教程将详细讲解如何高效使用 git stash,并掌握清理 stash 的正确方法,保持仓库的整洁。

一、git stash 的基本操作

创建 stash

当你工作目录有未提交的修改,但又不想立即创建一次完整的提交时,可以使用以下命令将修改暂存:

git stash

这条命令会保存当前工作目录和暂存区的修改,并将工作目录恢复到上一次提交的状态。未被 Git 跟踪的新文件(Untracked files)默认不会被 stash。如果你想同时暂存未跟踪的文件,可以使用:

git stash -u
# 或完整写法
git stash --include-untracked

你也可以为 stash 添加一段描述,方便日后识别:

git stash save "修复了登录按钮的样式问题"

在较新版本的 Git 中,推荐使用 git stash push -m "描述" 来替代 save 子命令。

查看 stash 列表

任何时候你都可以查看当前所有的 stash 记录:

git stash list

输出示例:

stash@{0}: WIP on main: 3a2b1c0 修复分页bug
stash@{1}: On feature/login: 临时保存登录页改动
stash@{2}: WIP on develop: 5d8e9f2 重构用户模块

每条 stash 记录都以 stash@{n} 的形式表示,{0} 代表最新的 stash,数字越大代表越早的保存。

应用 stash

当你需要恢复之前暂存的修改时,有两种常用方式:

  • git stash pop:应用最近的 stash(即 stash@{0}),并将其从 stash 列表中自动删除。这是“一次性”恢复并清理的方法。

    git stash pop
    
  • git stash apply:应用最近的 stash,但保留该 stash 记录,不会从列表中删除。如果你想应用一个更早的 stash,可以指定索引:

    git stash apply stash@{2}
    

如果应用 stash 时产生冲突,Git 会提示你解决冲突。冲突解决后,手动标记为已解决并提交即可。此时,如果使用了 pop,stash 记录不会被自动删除(因为可能还需要保留用于引用),你可以在冲突完全解决后手动删除它。

删除单个 stash

如果某个 stash 已经不需要了(比如你已经成功应用并提交了修改,或者确认该 stash 已过期),可以手动删除:

git stash drop stash@{0}

不指定索引时,默认删除最新的 stash。删除后,git stash list 中的索引会自动重排。

清空所有 stash

当你确认整个 stash 列表中的记录都不再需要时,可以执行一次性清空操作:

git stash clear

警告:这条命令不可逆,会删除所有 stash 记录,请务必在执行前确认列表中没有需要保留的修改。

二、清理 stash 的最佳时机

很多开发者只在 stash 堆积到让人眼花缭乱时才想到清理,这其实是一种低效的习惯。更好的做法是将清理融入日常的工作流中,在以下场景及时处理:

  1. 成功恢复并提交后
    当你使用 git stash pop 恢复了暂存内容,并基于它完成了新提交后,stash 已经自动删除,无需额外操作。如果你因为冲突等原因使用了 apply,在确认提交完成后,一定要记得执行 git stash drop 删除对应的记录。

  2. 确认 stash 内容已无用
    例如你临时 stash 了一个实验性的改动,后来决定放弃这个方向,那么就应该立即删除该 stash,避免日后误用。

  3. 定期审查 stash 列表
    建议在每周或每个迭代结束时,执行一次 git stash list,检查是否有多余的记录。如果发现某个 stash 的描述不清晰,可以当场决定是应用、丢弃还是重新整理。

  4. 切换长期分支前
    如果你准备长时间离开当前分支(例如休假或投入另一个大项目),最好将手头的 stash 全部清理干净,要么转为正式提交,要么干脆丢弃,以免几个月后回来时面对一堆“WIP on ...”不知所措。

三、高级技巧:让 stash 更有条理

良好的 stash 管理习惯可以大大减少需要清理的负担。

给 stash 起一个好名字

避免使用无意义的自动生成消息(如 “WIP on branch”),始终加上清晰的描述:

git stash push -m "修复用户头像上传报错-待测试"

这样在 git stash list 中一眼就能知道每个 stash 的用途,方便决定保留还是删除。

创建分支来“固化” stash

如果一个 stash 包含了一个复杂的、值得保留的修改,但暂时不适合合并到当前分支,你可以将该 stash 转换为一个独立分支进行长期开发:

git stash branch <新分支名> stash@{1}

这条命令会基于该 stash 的父提交创建一个新分支,并应用该 stash 的修改。完成后,你可以像开发普通分支一样继续工作。创建分支后,对应的 stash 记录通常会被自动删除,这是一种将临时 stash “升级”为正式开发分支的清理方法。

只 stash 部分文件

有时你只希望暂存某些特定文件,而保持其他文件的改动在工作目录中,可以使用:

git stash push -m "只暂存样式文件" path/to/style.css path/to/another.css