如何在git中恢复丢失的提交?

时间:2017-05-05 17:30:37

标签: git github

我是git / github的新手并且最近开始使用它。

我在git中有一个项目有一些提交,但是,我强制使用git push -f origin master推入git,现在,我已经丢失了所有以前的提交,并且只有一个最近被推送。

如何在git中将我的项目恢复到以前的状态?

我做过的事情: git reflog(这不会给我以前的提交细节)

  

213bcde HEAD @ {0}:恢复:恢复“V3文件”cb24c10 HEAD @ {1}:重置:   转移到HEAD cb24c10 HEAD @ {2}:重置:移动到   cb24c103e6c0400760a20098a2baceb0601bb858 cb24c10 HEAD @ {3}:checkout:   从主人转向主人cb24c10   HEAD @ {4}:提交(初始):V3>文件

我需要进行超出cb24c10 head @ {4}的提交:commit(初始):V3文件

git revert HEAD --no-edit

git show  这仅显示当前提交SHA

的详细信息

git fsck --no-reflogs

这为我提供了一个悬空blob,我不确定这是否是对旧提交的引用

  

检查对象目录:100%(256/256),完成。晃来晃去   e6a2438a4750e9cda68ce2d916c1b8a65dcc5384

请有人协助让我知道将项目恢复到以前状态的后续步骤。

不幸的是,我没有关闭我的终端窗口,我可以拥有之前提交的SHA b0b7eba。我该如何恢复到这种状态?

git push -f origin master Delta压缩最多使用4个线程。 书写对象:100%(507/507),13.55 MiB | 7.17 MiB / s,完成。 总计507(delta 109),重复使用0(delta 0) 远程:解决增量:100%(109/109),完成。 要https:http://.filename.git  + b0b7eba ... cb24c10 master - >主人(强制更新)

1 个答案:

答案 0 :(得分:1)

更新QUESITON中的新信息

鉴于b0b7eba的原始提交SHA1至少让我们尝试一些事情。

首先,

git checkout b0b7eba

如下所述,如果这是一个较新的克隆,该命令将失败。但如果它没有失败,那么你的状态很好。

git branch -f master
git push -f

如果它失败了(如果你没有旧的回购试用),我们又会回到github;但至少我们知道告诉github我们想要什么。我必须再次对使用的具体步骤嗤之以鼻(因为我并没有真正做很多github),但你应该能够导航到特定的提交(几乎肯定会在那里存在),然后......

  • 标记,然后提取,然后结帐标记,然后branch -f master,然后push -f
  • 在其上创建一个分支,...
  • 只需通过Web API将主分支移动到它

原始回复

所以有一件事需要知道:如果你没有在强制推动之前创建的本地仓库,那就不容易了。

你提到尝试reflogs,但听起来你说他们回去的时间不够远。现在也许那是因为旧的reflogs已经过期了,但除非你以不寻常的方式配置了东西,否则我对此表示怀疑。所以我想知道你是否一直试图使用在推力之后创建的克隆来解决这个问题;因为事实是,reflog只是repo的一个克隆的本地。因此,在强制推送之后创建的任何克隆都不可能具有有用的reflog条目。如果您有用于强制推送的克隆,那么这是最好的选择。

同样,你提到找到一个悬垂的blob。 blob是单个文件的内容;您要查找的对象类型是COMMIT。没有再次显示悬空提交的事实表明克隆是在强制推送之后创建的(因为此时您想要的提交无法访问,并且不会包含在用于初始化新克隆的包中)。

(不过,如果你对你可以做的对象感到好奇

git cat-file -p e6a2438a4

看看它是什么。)

强制推送是历史重写,revert无法帮助解决这个问题。 (它只撤消当前历史中所理解的提交内的更改。)

你最好的选择是进入强制推进的回购并检查其reflog。如果那是不合适的话,你就会受到github API的支配(我不太了解它);似乎这里可能有一些有用的建议:https://objectpartners.com/2014/02/11/recovering-a-commit-from-githubs-reflog/