储藏与清理 (Stashing)
在开发过程中,我们经常会遇到这样的场景:你正在为一个新功能编写代码,突然接到一个紧急 Bug 修复任务,必须立即切换到另一个分支。但你当前的工作目录中还有未提交的修改,而且这些修改还不够完整,不能创建一个 Commit。
这时,git stash(储藏)就是你的救星。
什么是储藏 (Stashing)?
Section titled “什么是储藏 (Stashing)?”git stash 会处理工作目录的脏状态(即被追踪文件的修改和暂存区的修改),将它们保存到一个未完成变更的栈中,您可以随时重新应用这些变更。
简单来说,它就像按下“暂停”键,把你当前乱糟糟的工作台(工作目录)清理干净,保存到后台,等你处理完急事(切换分支修复 Bug)后,再按“恢复”键,把工作台还原。
保存当前进度
Section titled “保存当前进度”要储藏当前的修改,只需运行:
git stash或者为了更清晰,给这次储藏加个备注:
git stash push -m "正在开发用户登录功能,暂停修Bug"执行后,被追踪文件的修改会被储藏,工作目录中这部分变得干净。但需要注意:默认情况下,git stash 不会储藏未追踪文件(untracked files)和被忽略的文件,它们仍会留在工作区。如果你需要储藏所有内容,请参阅下方”进阶技巧”章节。
查看储藏列表
Section titled “查看储藏列表”你可以多次储藏修改。使用以下命令查看储藏栈:
git stash list输出示例:
stash@{0}: On feature-login: 正在开发用户登录功能,暂停修Bugstash@{1}: On main: 之前的临时修改当你处理完其他任务回到这个分支,想要恢复之前的进度时,有两种主要方式:
1. 应用并保留 (apply)
Section titled “1. 应用并保留 (apply)”如果你想应用最近一次的储藏,但不从栈中删除它(比如你想把它应用到多个分支):
git stash apply如果要应用指定的某次储藏(例如 stash@{2}):
git stash apply stash@{2}2. 应用并删除 (pop)
Section titled “2. 应用并删除 (pop)”这是最常用的方式。它会应用最近一次储藏,并在应用成功后自动从栈中移除:
git stash pop如果你决定不再需要某次储藏的内容,可以手动删除它:
# 删除最近一次git stash drop
# 删除指定的一次git stash drop stash@{0}
# 清空所有储藏git stash clear包含未追踪的文件
Section titled “包含未追踪的文件”默认情况下,git stash 只会储藏被追踪(tracked)的文件。如果你新增了文件但还没 git add,它们不会被储藏。
要强制储藏包括未追踪文件(untracked files)在内的所有修改:
git stash -u# 或者git stash --include-untracked如果你甚至需要储藏被 .gitignore 忽略的文件(如构建产物、临时缓存),使用:
git stash -a# 或者git stash --all储藏特定文件
Section titled “储藏特定文件”如果你只想储藏某个特定文件的修改,而不是整个工作目录:
git stash push -m "只储藏配置文件" path/to/config.json最佳实践:上下文切换
Section titled “最佳实践:上下文切换”最常见的工作流如下:
- 开发中途被打断:
Terminal window git stash push -m "WIP: feature X" - 切换分支修复 Bug:
Terminal window git checkout maingit pullgit checkout -b hotfix-urgent# ... 修复 Bug, 提交, 推送 ... - 回到原分支继续开发:
Terminal window git checkout feature-Xgit stash pop
通过熟练使用 git stash,你可以保持 Git 历史的整洁(避免产生大量无意义的 “WIP” 提交),同时在多任务并行时游刃有余。