未提交代码切换至其他分支,切回原分支后代码丢失如何找回?
关于Git分支切换后代码找回的两个问题解答
嘿,这俩问题绝对是Git新手常踩的坑,我来给你讲明白怎么回事以及怎么解决:
问题1:切换至其他分支但未提交当前代码,能否找回切换前的代码?
大部分情况下是可以找回的,具体分两种场景来看:
- 如果切换分支时Git没提示冲突(也就是你修改的文件在目标分支里没有被改动过),那你的修改其实会保留在工作区里——哪怕你切去了其他分支,只要没做额外操作,切回原分支后修改还在原地。
- 如果切换分支时Git弹出冲突提示,不让你直接切换,这时候你要么得先提交修改,要么用
git stash暂存。要是你没做这两步就强制切换(比如用了git checkout -f或者git switch -f),工作区的修改会被覆盖,但别慌,Git其实悄悄留了备份,看问题2的解决方案就行。
问题2:从branch1切到branch2忘提交,切回branch1发现代码丢失,怎么找回?
这种情况一般是因为你切换时,branch2和你修改的文件有冲突,你强制切换导致工作区被覆盖了。按下面的方法依次尝试,大概率能找回来:
先检查暂存区和stash记录
- 先跑
git status看看有没有意外暂存的文件,如果有,用git restore --staged <文件名>把文件从暂存区恢复到工作区就行。 - 试试
git stash list,要是之前不小心触发了stash(比如Git提示冲突时你选了默认选项),直接用git stash apply就能把暂存的修改恢复回来。
- 先跑
用Git引用日志(reflog)找回
Git会记录你在仓库里的所有操作,哪怕是没提交的修改也可能被存在“孤儿提交”里:- 执行
git reflog,你会看到一串操作记录,每条前面有个哈希值。 - 用
git show <哈希值>逐个查看记录对应的内容,找到包含你丢失代码的那条。 - 找到后,要么用
git cherry-pick <哈希值>把这个提交的内容应用到当前分支,要么用git restore <文件名> <哈希值>:<文件名>单独恢复某个文件。
- 执行
用git fsck查找未被引用的对象
如果reflog里没找到,试试git fsck --lost-found,这个命令会找出仓库里所有没被任何分支或标签引用的Git对象:- 跑完命令后,Git会把这些对象存在
.git/lost-found/other目录里,每个文件对应一个哈希值。 - 用
git show <哈希值>逐个查看这些文件,找到包含你丢失代码的那个,再按上面的方法恢复即可。
- 跑完命令后,Git会把这些对象存在
最后给你提个醒:以后切换分支前,要么提交当前修改,要么用git stash暂存,这是最稳妥的做法,能避免绝大多数这类麻烦。
内容的提问来源于stack exchange,提问作者tiennl
相关产品推荐
相关产品推荐

