Git stash 暂存后别忘了清理
什么是 Git Stash?为什么需要“清理”?
git stash 是 Git 提供的一个非常实用的命令,它可以让你暂时保存当前工作目录中的修改(包括已跟踪文件的更改和暂存区的内容),并将工作目录恢复到一个干净的状态,以便你可以切换到其他分支、拉取最新代码或进行其他操作。你可以把 stash 理解为一个“草稿箱”或“临时保存区”,方便你在任务中断时快速保存现场。
然而,正因为 stash 操作太方便了,很多开发者会习惯性地执行 git stash 或 git 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 堆积到让人眼花缭乱时才想到清理,这其实是一种低效的习惯。更好的做法是将清理融入日常的工作流中,在以下场景及时处理:
-
成功恢复并提交后
当你使用git stash pop恢复了暂存内容,并基于它完成了新提交后,stash 已经自动删除,无需额外操作。如果你因为冲突等原因使用了apply,在确认提交完成后,一定要记得执行git stash drop删除对应的记录。 -
确认 stash 内容已无用
例如你临时 stash 了一个实验性的改动,后来决定放弃这个方向,那么就应该立即删除该 stash,避免日后误用。 -
定期审查 stash 列表
建议在每周或每个迭代结束时,执行一次git stash list,检查是否有多余的记录。如果发现某个 stash 的描述不清晰,可以当场决定是应用、丢弃还是重新整理。 -
切换长期分支前
如果你准备长时间离开当前分支(例如休假或投入另一个大项目),最好将手头的 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