先说结论:被 git pull 或 git reset --hard 覆盖掉的本地未提交代码,只要文件曾被 PhpStorm 跟踪并保存过,Local History 就能救回来。它不看 Git 的状态,只认自己拍下的快照。

为什么 Git 操作后 Local History 还在,但右键菜单灰了?
这不是功能失效,而是你当前操作的对象不对。
一个常见的误区是:直接在已被 Git 覆盖、内容全变的文件上右键——它可能已经脱离了 IDE 的监控路径(比如刚被 git checkout 替换,IDE 还没重载过来)。
正确的做法是:在 Project 工具窗口(Alt+1)里,右键项目根目录 → Local History → Show History。
如果文件本身已从项目结构里消失(比如被 git clean -fd 删了),也必须在父级目录(如 src/ 或整个项目根)上右键,不能对着空白处或者 Terminal 窗口点。
Local History 能找回哪些“Git 不认”的文件?
它只关心三件事:是否在项目根目录下、是否至少保存过一次、是否没被 IDE 排除。所以,下面这些情况它都能救:
- 新建的
utils.php写了一半,还没git add,就被git pull覆盖——只要你按过Ctrl+S,快照就在。 - 放在
app/Temp/下的调试脚本,没纳入 Git,但被git reset --hard连带清掉——只要路径没进Settings → Editor → File Types → Ignore files and folders,就安全。 vendor/里的修改?默认不行——该目录被 IDE 自动排除,除非你手动删掉vendor在忽略列表里的规则。
恢复时,怎么避免二次覆盖?
Revert 是覆盖操作,而你刚被 Git 覆盖的文件很可能还开着、有未保存的改动。这里有个关键点:
- 先确认当前编辑器 tab 里文件的状态:如果右上角有星号(*),说明还有未保存的脏数据,先
Ctrl+S或另存为备份。 - 双击历史记录中的某条快照,在对比视图里预览内容——
Local History不显示文件内容缩略图,不点开看一眼,你无法确定那是不是你要的版本。 - 只想拿回几行代码?别点
Revert。在对比视图中,右键左侧(旧版)某段代码 →Copy Lines from Left to Right,粘贴到当前文件对应位置即可。 - 如果恢复的是整个文件夹,
Revert会把该路径下所有快照中存在的文件都还原,不是单个文件粒度——小心误恢复其他人的临时测试文件。
快照没了?检查这三处
不是所有“删了就找不回”的情况都是真丢了。不妨先排查一下:
.idea/localHistory/目录是否被手动清理过?这个路径下按项目结构存着二进制快照,删了就真没了。- 设置里是否关闭了功能?去
Settings → Version Control → Local History,确认Enable local history是勾选状态。 - 保留天数是否太短?默认是 5 天,如果你是上周五改的,今天才想起来找,大概率已被自动清理——调大
Keep local history for (days)是预防性的刚需。
最后,还有一个容易被忽略的点:Local History 快照生成时机不依赖 Git 操作,但依赖 IDE 的文件系统事件监听。如果文件被外部工具(如 rsync、mv 命令)直接替换,而 PhpStorm 没触发重载,那一瞬间的快照可能就断了。所以,对关键临时文件,手动 Ctrl+S 比等自动保存更可靠。