Git stash后如何恢复被覆盖的修改?

IT人付敏 阅读 110

我在两个分支间切换时用了git stash暂存当前修改,之后执行git stash pop时,发现之前修改的某个文件内容被覆盖了,只剩stash里的内容,而不是合并结果。试过git stash apply还是不行,这是为什么?

具体场景:正在开发feature-a分支改了组件A,临时要修prod环境的bug。执行git stash后切换到main分支修复,提交后切回feature-a,这时候执行:

git stash pop
Auto-merging src/componentA.js
CONFLICT (content): Merge conflict in src/componentA.js

但冲突提示里显示stash里的版本完全替换了当前工作区的修改,原本没被stash暂存的新增代码全没了,该怎么正确恢复丢失的部分?

我来解答 赞 8 收藏
二维码
手机扫码查看
2 条解答
艺馨
艺馨 Lv1
这种情况我也遇到过,确实挺蛋疼的。git stash pop确实会直接覆盖工作区文件而不是合并,特别是当你的工作区有未暂存的修改时特别容易丢代码。

试试这个方法:
1. 先用 git fsck --lost-found 找找看丢失的修改,可能会在.git/lost-found目录下找到一些内容

2. 如果找不到,可以试试从reflog里恢复:
git reflog
# 找到stash之前的那个commit hash
git checkout [那个hash] -- path/to/componentA.js


3. 还有个更保险的做法,下次用stash时记得加上 -k 参数保留工作区修改:
git stash save -k "message"


4. 现在你遇到冲突了,可以手动合并:
git checkout stash@{0} -- path/to/file
git mergetool


建议以后用stash前先commit当前修改,或者用 git stash apply 而不是pop,这样不会自动删除stash内容。
点赞 1
2026-03-06 11:00
打工人世豪
这种情况确实挺烦人的,我也遇到过类似的坑。问题的核心是stash里的内容和当前工作区的修改有冲突,而Git默认不会帮你合并,而是直接用stash的内容覆盖了。

我的做法是这样的:首先别慌,执行 git fsck --full,这个命令可以帮你找到最近的悬空提交或丢失的改动。一般来说,被覆盖的修改应该还在Git的对象库里,只是暂时游离着。

接下来重点来了,运行 git reflog 查看操作记录,找到你执行stash pop之前的那个状态,通常会显示为类似HEAD@{1}这样的标识。记下这个引用。

然后你可以用 git checkout HEAD@{1} -- src/componentA.js 把丢失的修改恢复出来。这里的HEAD@{1}要替换成你实际看到的那个引用值。

为了避免再次踩坑,建议以后在切换分支前,先commit一个临时提交,而不是单纯依赖stash。或者用 git stash apply 而不是 git stash pop,这样即使合并出问题,stash的内容还在,可以多次尝试。

对了,如果你经常遇到这种需要暂存部分修改的场景,推荐试试 git stash push -p,可以选择性地暂存特定改动,能减少很多麻烦。
点赞 6
2026-02-15 22:34