Git拉取后本地文件丢失,已提交/暂存变更能否恢复?
Git拉取后丢失本地变更的恢复方案
问题场景
本地将部分文件变更加入暂存区并完成提交,推送时系统提示需先拉取远程分支。执行git pull origin master后,本地已提交但未推送的变更、暂存的内容全部丢失。操作过程中出现的错误信息如下:
第一阶段错误
git pull origin master remote: Enumerating objects: 11, done. remote: Counting objects: 100% (11/11), done. remote: Compressing objects: 100% (9/9), done. remote: Total 9 (delta 2), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (9/9), 6.55 KiB | 0 bytes/s, done. From https://github.com/xxxxxxx/xxxxx * branch master -> FETCH_HEAD b713141..adcf8c4 master -> origin/master error: Your local changes to the following files would be overwritten by merge: LIST OF FILES
后续错误
error: Your local changes to the following files would be overwritten by merge: .Rproj.user/1B350229/pcs/debug-breakpoints.pper .Rproj.user/1B350229/pcs/files-pane.pper .Rproj.user/1B350229/pcs/source-pane.pper .Rproj.user/1B350229/pcs/windowlayoutstate.pper .Rproj.user/1B350229/pcs/workbench-pane.pper Please commit your changes or stash them before you merge. error: The following untracked working tree files would be overwritten by merge: github-git-cheat-sheet.pdf Please move or remove them before you merge. Aborting Index was not unstashed. Merge with strategy ort failed.
尝试git fsck未成功,以下是针对两类丢失内容的恢复方法:
1. 恢复已提交但未推送的变更
Git会记录所有本地提交的操作日志,哪怕分支指针被覆盖,也能通过reflog找回:
- 执行
git reflog,查看所有分支的操作记录,找到你丢失的提交条目(格式类似abcdefg HEAD@{n}: commit: 你的提交描述) - 若要直接将当前分支重置到该提交,执行
git reset --hard <提交哈希值> - 若要将该提交应用到当前分支,执行
git cherry-pick <提交哈希值>
2. 恢复已暂存但未提交的内容
暂存区的内容会以Git对象的形式存储在本地仓库中,可通过以下步骤找回:
- 执行
git fsck --lost-found,Git会将所有未被引用的对象导出到.git/lost-found/other目录下 - 遍历该目录下的所有对象哈希,执行
git cat-file -p <对象哈希>查看内容,匹配你丢失的暂存文件 - 将匹配到的内容导出到对应文件:
git cat-file -p <对象哈希> > 目标文件名
内容的提问来源于stack exchange,提问作者menomale
相关产品推荐
相关产品推荐

