You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Git操作失误致C++私有项目代码丢失,求助恢复方案

如何恢复因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找回丢失的代码

别着急,从你提供的Git日志和reflog记录来看,你丢失的代码完全有机会恢复回来!

关键信息就在你的reflog里:d6f7f2a HEAD@{7}: commit: Initial Commit——这个提交应该就是你本地重写修改后的代码提交,它出现在你执行reset: moving to 315a581操作之前,说明Git还保留着这个提交的完整记录。

下面是具体的恢复步骤,跟着做就行:

  • 第一步:确认目标提交的内容
    先运行这条命令查看d6f7f2a提交里的具体内容,确认这就是你丢失的那部分重写代码:

    git show d6f7f2a
    

    如果输出里是你熟悉的代码内容,那就可以继续下一步了。

  • 第二步:恢复代码到当前分支
    这里有两种可选的恢复方式,根据你的需求选择:

    1. 直接重置分支到该提交(会覆盖当前master分支的现有状态,适合想直接回到代码丢失前的状态):
      git reset --hard d6f7f2a
      
    2. 将该提交合并到当前分支(保留现有分支的历史记录,适合不想丢失之前的revert操作记录):
      git cherry-pick d6f7f2a
      
  • 第三步:验证恢复结果
    执行完上面的命令后,打开Visual Studio检查项目文件,确认所有丢失的代码都回来了。没问题的话,就可以重新推送到你的GitHub私有仓库了。

最后给你个小提醒:以后在操作远程仓库前,建议先在本地创建一个备份分支,比如git checkout -b code-backup,这样就算出现误操作,也能快速从备份分支找回代码,减少不必要的麻烦。

内容的提问来源于stack exchange,提问作者Dvy Hrnsch

火山引擎 最新活动