如何恢复Git分支中丢失的.ipynb文件及历史提交?
恢复Git丢失的提交与代码
问题背景
团队共用同一Git仓库,每人在独立分支开发,共同编辑File.ipynb文件。MAIN是主分支,负责汇总可复用代码和文档,我们只往自己的分支推送代码,从MAIN拉取更新。
上周拉取MAIN到个人分支时出了问题,本地File.ipynb被MAIN分支内容覆盖,个人修改全丢了。本来想通过Git历史恢复,结果提交记录不见了,VSCode显示的最后一次提交是几个月前的,和实际情况不符。之后有人帮忙执行了git reset --hard HEAD~1,当前的git reflog记录如下:
PS C:\Users\USERNAME\source\repos\Repository> git reset --hard HEAD~1 PS C:\Users\USERNAME\source\repos\Repository> git reflog 93d4a14 (HEAD -> Branch) HEAD@{0}: reset: moving to HEAD~1 b7b9970 (origin/Branch) HEAD@{1}: pull --tags origin main: updating HEAD b7b9970 (origin/Branch) HEAD@{2}: commit (merge): Merge branch 'main' of https://gitlab.com/Lab/Repository into Branch 93d4a14 (HEAD -> Branch) HEAD@{3}: commit: 09192023 0b256c0 HEAD@{4}: pull --tags origin main: updating HEAD 0b256c0 HEAD@{5}: pull --tags origin main: updating HEAD 0b256c0 HEAD@{6}: pull --tags origin main: updating HEAD 0b256c0 HEAD@{7}: pull --tags origin main: updating HEAD 0b256c0 HEAD@{8}: commit: commit4 fbcb7ad HEAD@{9}: commit: commit3 756d688 HEAD@{10}: commit: commit2 be82e8e HEAD@{11}: commit: commit1 33ff098 (origin/Comp, main) HEAD@{12}: checkout: moving from main to Branch 33ff098 (origin/Comp, main) HEAD@{13}: clone: from https://gitlab.com/Lab/Repository
解决方案
一、Git操作恢复提交与代码
从git reflog的记录来看,丢失的提交都能通过哈希值找回:
恢复已提交的版本
- 要找回
commit1到commit4以及09192023这些提交,直接用对应的哈希重置分支:
这个哈希对应git reset --hard 0b256c0commit4之后的状态,执行后分支会回到包含所有个人提交的状态。 - 如果需要恢复合并MAIN后的状态(也就是拉取MAIN后的版本),执行:
执行后检查git reset --hard b7b9970File.ipynb,如果里面没有你的个人修改,再尝试下一步。
- 要找回
找回未提交的本地修改
如果你的修改没来得及提交,Git提交记录里没有,但可以用git fsck查找悬空的文件内容:git fsck --lost-found命令会把找不到归属的文件内容(blob)存到
.git/lost-found/other目录里,逐个打开这些文件,找到File.ipynb的内容后复制替换回去就行。
二、本地文件历史恢复
如果Git操作没找回,试试本地的文件历史功能:
- VSCode时间线:打开
File.ipynb,点击左侧的「源代码管理」图标,切换到「时间线」标签,找到包含你修改的版本,右键选择「恢复」。 - Windows文件历史:找到
File.ipynb所在的文件夹,右键→属性→以前的版本,选择有你修改的版本,点击「恢复」。
内容的提问来源于stack exchange,提问作者User9
相关产品推荐
相关产品推荐

