Git stash后如何恢复被覆盖的修改?
我在两个分支间切换时用了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暂存的新增代码全没了,该怎么正确恢复丢失的部分?
我的做法是这样的:首先别慌,执行
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,可以选择性地暂存特定改动,能减少很多麻烦。