切换回feature分支未执行git stash pop却自动恢复改动是什么原因?
可能的核心原因
- IDE自动恢复触发了
git stash apply:这是最高发的场景。VS Code、IntelliJ系IDE等带Git集成的开发工具,大多默认开启了「切换分支时自动恢复对应分支储藏」的功能。你切回feature分支时,IDE检测到该分支存在未弹出的stash条目,自动在后台执行了git stash apply操作,apply命令和pop的区别就是它不会删除储藏列表中的对应条目。你切换到main分支仅执行了pull操作,只要pull下来的内容和你stash的内容没有冲突,IDE后台执行apply时不会弹出任何提示,完全匹配你观察到的现象。 git stash push未覆盖全部未提交改动:默认情况下git stash push只会储藏已被Git追踪的文件(即曾经执行过git add的文件),如果你当时的改动包含未追踪的新建文件,这部分文件不会被存入stash,会一直保留在工作区,你切换分支过程中只要没有文件冲突,这些改动会一直跟随工作区,让你误以为是stash的内容被自动恢复了。- Git别名/自定义钩子触发了自动apply:如果你配置过Git的checkout钩子、或者给分支切换命令配置过带自动恢复stash逻辑的别名,也可能在切回feature分支时无感知触发
git stash apply。
验证方法
- 执行
git diff stash@{0}(将stash@{0}替换为你查询到的对应储藏条目编号),对比当前工作区改动和储藏内容是否完全一致,如果一致可以确认是有操作触发了git stash apply。 - 检查你使用的IDE的Git配置,确认是否开启了自动恢复stash的相关选项,大部分IDE的该功能可以在Git设置页手动关闭。
- 执行
git config --list | grep alias检查是否配置了和checkout、switch相关的自定义别名,同时查看.git/hooks/post-checkout文件是否存在可执行的自定义逻辑。
内容的提问来源于stack exchange,提问作者Leon
相关产品推荐
相关产品推荐

