浏览Git中的孤立提交

我的git仓库已经不知何故了 – 我今天早上加载了msysgit,而不是在当前目录之后显示的分支名称,它说“((ref:re …))”,“git status”新文件,“git日志”和“git reflog”告诉我“致命的:错误的默认版本'HEAD'”等等。

做'git reflog –all'或者'gitk –all'会告诉我其余的版本库是完好无损的,但是看起来我正在使用的分支已经消失了,这就解释了为什么HEAD似乎不存在/指向任何东西。

我知道git保留了各种各样的信息,而且我假设我的提交已经成为孤儿了,那么是否有一些命令会向我显示这些提交,所以我可以重置HEAD给他们?

编辑:哦,亲爱的。 我发现'git fsck','git fsck –full'报告“致命的:object 03ca4 … is corrupted”。 我能做些什么呢?

编辑:哦,亲爱的,亲爱的。 我检查了另一个分支,然后尝试使用'git checkout -b lostbranchname'重新创build具有相同名称的原始分支,而git则显示“错误:无法parsing引用refs / heads / lostbranchname:没有错误,致命:失败locking参考更新:没有错误“。 “没有错误”一定是一个特别讨厌的错误。 所以看起来好像还在附近,却无法使用,无法被杀死。

编辑:超级骗子哦,亲爱的。 我已经做了一堆拆包,重新包装和replace的东西在这里build议: 如何恢复受硬盘故障损坏的Git对象? ,但现在我得到另一个散列报告为腐败,像'混帐状态'一样无害。 我觉得整个事情都是一塌糊涂的。 Git是可爱的,但我不应该处理这种事情。

我想我会回答自己的问题,而不是让这个开放。 使用git reflog --all是浏览孤立提交的好方法 – 使用SHA1哈希值可以重build历史logging。

在我的情况下,存储库已损坏,所以这并没有帮助; git fsck可以帮助您find并有时修复存储库本身的错误。

使用git 2.9.x / 2.10(2016年第三季度),你不必使用git reflog --allgit reflog就足够了。

见SZEDERGábor ( szeder )的 提交71abeb7 (2016年6月3日) 。
(由Junio C gitstergitster -在承诺7949837 ,2016年7月6日)

reflog :继续走过根提交的reflog

如果存储库包含多个根提交,则其HEAD reflog可能包含多个“创build事件”,即“from”值为空sha1的条目。
列出这样的reflog当前停止在第一个这样的条目,即使reflog仍然包含较旧的条目。
这可以吓倒用户认为他们的reflog在' git checkout --orphan '之后被截断。

继续根据前面的reflog条目的“新”值来遍历经过这样的创build事件的reflog。

git的一个很好的特性就是能检测到腐败。 但是,它不包括错误更正,以防止腐败。

我希望你已经把这个版本库的内容推送到另一台机器,或者你有备份来恢复损坏的部分。

我在windows上没有任何使用git的经验,但从来没有在Linux或OS X上看到过使用git的这种行为。