Git操作失误致C++私有项目代码丢失,求助恢复方案
我已经开发一个私有C++工具长达一个月,因为对Github操作不熟悉,误操作导致项目代码全部丢失,恳请协助恢复。具体操作过程如下:
数周前我在Visual Studio中尝试使用Github,将大量文件提交至私有Github仓库后便未再使用该仓库,转而对工具进行了大量重写和修改。今日我想将更新后的项目提交至Github仓库,先在github.com上删除了数周前的测试提交,随后回到Visual Studio尝试提交新代码,过程中触发了pull/push操作,之后所有新增的代码均被删除。
以下是相关Git日志信息:
EDIT: git log --oneline 输出
D:\ME\Documents\Visual Studio 2019\repos>git log --oneline 4c6b7d4 (HEAD -> master) Revert "Delete myAPI/HTTPCurlWrapper directory" 4ac3277 Revert "Delete myAPI/ImageRecognition directory" 49c9309 Revert "Delete CellMode/CellModedirectory" 6edabb4 Revert "Delete myAPI/myAPI directory" c14b3d6 Revert "Delete myAPI directory" 315a581 (origin/master) Delete myAPI directory ae8480c Delete myAPI/myAPI directory d470468 Delete myAPI/HTTPCurlWrapper directory 49b3902 Delete CellMode/CellModedirectory 1cc00db Delete myAPI/ImageRecognition directory (省略重复的日志内容)
EDIT2: git --no-pager log --pretty=reference --after=2021-04-01 输出
D:\ME\Documents\Visual Studio 2019\repos>git --no-pager log --pretty=reference --after=2021-04-01 4c6b7d4 (Revert "Delete MyAPI/HTTPCurlWrapper directory", 2021-06-09) 4ac3277 (Revert "Delete MyAPI/ImageRecognition directory", 2021-06-09) 49c9309 (Revert "Delete CellMode/CellMode directory", 2021-06-09) 6edabb4 (Revert "Delete MyAPI/MyAPI directory", 2021-06-09) c14b3d6 (Revert "Delete MyAPI directory", 2021-06-09) 315a581 (Delete MyAPI directory, 2021-06-09) ae8480c (Delete MyAPI/MyAPI directory, 2021-06-09) d470468 (Delete MyAPI/HTTPCurlWrapper directory, 2021-06-09) 49b3902 (Delete CellMode/CellMode directory, 2021-06-09) 1cc00db (Delete MyAPI/ImageRecognition directory, 2021-06-09) b173621 (framework header, 2021-05-27) 1a57ac4 (pch files, 2021-05-27) 332d989 (libs, 2021-05-26) ac63482 (Start Commit, 2021-05-26) d47a27e (start, 2021-05-26)
git --no-pager reflog --after=2021-04-01 输出
D:\Davy\Documents\Visual Studio 2019\repos>git --no-pager reflog --after=2021-04-01 4c6b7d4 (HEAD -> master, origin/master) HEAD@{0}: checkout: moving from master to master 4c6b7d4 (HEAD -> master, origin/master) HEAD@{1}: revert: Revert "Delete MyAPI/HTTPCurlWrapper directory" 4ac3277 HEAD@{2}: revert: Revert "Delete MyAPI/ImageRecognition directory" 49c9309 HEAD@{3}: revert: Revert "Delete CellMode/CellMode directory" 6edabb4 HEAD@{4}: revert: Revert "Delete MyAPI/MyAPI directory" c14b3d6 HEAD@{5}: revert: Revert "Delete MyAPI directory" 315a581 HEAD@{6}: reset: moving to 315a5816b08dd662237d28f09aa70cb0ea975bae d6f7f2a HEAD@{7}: commit: Initial Commit b173621 HEAD@{8}: checkout: moving from master to master b173621 HEAD@{9}: commit: framework header 1a57ac4 HEAD@{10}: commit: pch files 332d989 HEAD@{11}: commit: libs ac63482 HEAD@{12}: commit: Start Commit d47a27e HEAD@{13}: commit: start af4d81e HEAD@{14}: checkout: moving from master to master af4d81e HEAD@{15}: initial pull
请问是否有办法恢复我丢失的项目代码?
别着急,从你提供的Git日志和reflog记录来看,你丢失的代码完全有机会恢复回来!
关键信息就在你的reflog里:d6f7f2a HEAD@{7}: commit: Initial Commit——这个提交应该就是你本地重写修改后的代码提交,它出现在你执行reset: moving to 315a581操作之前,说明Git还保留着这个提交的完整记录。
下面是具体的恢复步骤,跟着做就行:
第一步:确认目标提交的内容
先运行这条命令查看d6f7f2a提交里的具体内容,确认这就是你丢失的那部分重写代码:git show d6f7f2a如果输出里是你熟悉的代码内容,那就可以继续下一步了。
第二步:恢复代码到当前分支
这里有两种可选的恢复方式,根据你的需求选择:- 直接重置分支到该提交(会覆盖当前master分支的现有状态,适合想直接回到代码丢失前的状态):
git reset --hard d6f7f2a - 将该提交合并到当前分支(保留现有分支的历史记录,适合不想丢失之前的revert操作记录):
git cherry-pick d6f7f2a
- 直接重置分支到该提交(会覆盖当前master分支的现有状态,适合想直接回到代码丢失前的状态):
第三步:验证恢复结果
执行完上面的命令后,打开Visual Studio检查项目文件,确认所有丢失的代码都回来了。没问题的话,就可以重新推送到你的GitHub私有仓库了。
最后给你个小提醒:以后在操作远程仓库前,建议先在本地创建一个备份分支,比如git checkout -b code-backup,这样就算出现误操作,也能快速从备份分支找回代码,减少不必要的麻烦。
内容的提问来源于stack exchange,提问作者Dvy Hrnsch




