
作为一名开发者,你一定遇到过这样的场景:
你正在一个功能分支上埋头苦干,代码写了一半,还没到提交的时候。突然,需要切换到另一个分支去查看点什么——可能是看看主分支上的代码逻辑,可能是紧急修复一个线上bug。
你自信满满地执行 git checkout master,结果Git无情地拒绝了:
error: Your local changes would be overwritten by checkout.
Please commit your changes or stash them before you switch branches.
这时候怎么办?提交一个半成品?太丑了。放弃修改?舍不得。有没有一种方式,能先把当前的工作“存起来”,等忙完了再拿出来继续?
答案是:Git stash。
今天我们就来聊聊这个日常开发中高频使用,却又常常被低估的功能——Git暂存。
一、核心场景:临时切换分支前保存未完成工作
这是git stash最经典、最常用的场景。
场景还原:
假设你在bugfix/user-auth-error分支上修改了app/server.js,代码还没写完,不想提交。但你需要切换到master分支去验证某个功能。
直接切换会被Git拒绝,因为Git不知道该怎么处理你的本地修改——直接覆盖?太危险了。留着不管?切换过去会乱。
解决方案:
第一步:暂存当前修改
# 查看当前修改状态
git status
# 输出:app/server.js 已被修改
# 暂存未完成的修改
git stash
# 输出:Saved working directory and index state WIP on bugfix/user-auth-error: xxx
执行git stash后,Git会把你的所有修改(已暂存和未暂存的)打包保存到一个“暂存栈”里,然后清理你的工作区。
第二步:验证工作区干净
git status
# 输出:nothing to commit, working tree clean
工作区干净了,现在可以放心切换分支了。
git checkout master
# 成功切换
第三步:在目标分支完成操作
在master分支上做你想做的事——查看代码、测试功能、修复紧急bug等。
第四步:返回原分支,恢复修改
# 切回原开发分支
git checkout bugfix/user-auth-error
# 恢复最近一次暂存的修改,并删除stash记录
git stash pop
执行git stash pop后,你之前的修改就会原封不动地恢复到工作区,可以继续愉快的开发了。
小贴士:
-
git stash pop会在恢复后删除stash记录。如果你想保留stash记录,可以用git stash apply。
-
如果你有多个stash,可以用git stash list查看,然后用git stash pop stash@{n}指定恢复哪一个。
二、进阶场景:本地调试神器——验证问题是否由当前修改导致
这是很多资深开发者常用的技巧,甚至可以在同一个分支内使用。
场景还原:
你在当前分支做了一些代码修改,然后发现原本正常运行的某个功能突然无法工作了。你很困惑:是我的修改破坏了功能?还是这个功能之前就有问题,只是我今天才发现?
解决方案:
这时候不需要提交代码,不需要新建分支,git stash就能帮你快速定位。
第一步:暂存所有本地修改
git stash
执行后,你的所有修改都被隐藏起来,工作区回到了修改前的干净状态。
第二步:测试目标功能
现在,测试那个出问题的功能。看看在没有你修改的情况下,它是否正常运行。
-
如果功能正常:说明确实是你的修改破坏了它。问题定位成功!
-
如果功能仍然异常:说明修改前就有问题,和你的修改无关。可能需要去查查是不是别人改坏了,或者历史遗留问题。
第三步:恢复修改继续开发
测试完成后,把修改恢复回来:
git stash pop
你的所有修改都回来了,可以继续开发。整个过程干净利落,不留痕迹。
这个场景的精髓: 你不需要提交、不需要分支切换、不需要临时备份文件。一个git stash,让你在“我的代码”和“原始代码”之间自由切换,定位问题效率翻倍。
三、核心命令总结
| git stash | 暂存当前所有未提交的修改(已跟踪文件),清理工作区 |
| git stash pop | 恢复最近一次暂存的修改,并删除对应的stash记录 |
| git stash apply | 恢复最近一次暂存的修改,但保留stash记录 |
| git stash list | 查看所有暂存记录 |
| git stash drop | 删除指定的stash记录 |
| git stash clear | 清空所有stash记录 |
注意事项:
-
git stash默认只暂存已跟踪文件的修改。对于新增的、尚未被Git跟踪的文件,需要先git add才能被stash。
-
如果你在恢复时遇到冲突,Git会提示你手动解决冲突,解决后继续操作即可。
四、总结
git stash是一个非常轻量、灵活的工具,它解决了一个日常开发中的高频痛点:如何在不提交的前提下,临时清理工作区。
无论是临时切换分支,还是快速验证问题来源,git stash都能帮你优雅地完成。掌握它,你的Git技能树又点亮了一颗星。
最后一句金句:
存在未完成的本地修改时,Git不会让你切换分支——你得先告诉Git怎么处理这些修改。而git stash,就是最好的答案。





