浏览Git中的孤立提交

时间:2010-01-19 10:39:17

标签: git

我的git存储库已经不知何故了 - 我今天早上加载了msysgit而不是在当前目录之后显示的分支名称,它说“((ref:re ...))”,“git status”报告作为一个新文件的所有内容,'git log'和'git reflog'告诉我“致命:错误的默认修订'HEAD'”,等等。

做'git reflog --all'或'gitk --all'告诉我存储库的其余部分是完整的,但看起来我正在处理的分支刚刚消失,这解释了为什么HEAD看起来不像存在/指向任何东西。

我知道git会抓住各种各样的信息,而且我认为我的提交已经以某种方式成为孤儿,所以是否有一些命令会向我显示这些提交以便我可以将HEAD重置为它们?

编辑:哦,亲爱的。我发现'git fsck'和'git fsck --full'报告“致命:对象03ca4 ......已损坏”。我能为此做些什么?

编辑:亲爱的哦亲爱的。我检查了另一个分支,然后尝试使用'git checkout -b lostbranchname'重新创建具有相同名称的原始分支,并且git说“错误:无法解析引用引用/ heads / lostbranchname:没有错误,致命:失败锁定ref以进行更新:没有错误“。 “没有错误”必定是一个特别令人讨厌的错误。所以看起来它仍然在闲逛,但无法使用,也无法被杀死。

编辑:超级亲爱的哦亲爱的。我做了一堆解包和重新打包并替换了这里建议的东西:How to recover Git objects damaged by hard disk failure?,但现在我得到另一个哈希报告为腐败,因为某些东西像'git status'一样无害。我认为整个事情都是有道理的。 Git很可爱,但我不应该处理这类事情。

4 个答案:

答案 0 :(得分:118)

我认为我会回答自己的问题,而不是保持开放。使用git reflog --all是浏览孤立提交的好方法 - 并使用可以重建历史记录的SHA1哈希值。

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

答案 1 :(得分:14)

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

commit 71abeb7SZEDER Gábor (szeder)(2016年6月3日) (由Junio C Hamano -- gitster --commit 7949837合并,2016年7月6日)

  

reflog:继续走过reflog过去的根提交

     

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

     

继续将reflog引导到基于此类的创建事件   在reflog条目的“新”值之前。

答案 2 :(得分:4)

我通常会发现git reflog的输出令人困惑。对我来说,从git log --graph --reflog理解提交图要容易得多。覆盖log格式以仅显示提交摘要也可以使图形更易于遵循:

$ git config --global alias.graph "log --graph --all --format='%h %s%n        (%an, %ar)%d' --abbrev-commit"
$ git graph --reflog

* f06abeb Add feature
|         (Sue Dakota, 4 days ago) (HEAD -> master)
* f126291 Fix the build
|         (Oski M. Wizard, 5 days ago) (origin/master, master)
* 3c4fb9c Break the build
|         (Alyssa P. Hacker, 5 days ago)
| * e3124bf fixup! More work for feature
| |         (Sue Dakota, 4 days ago)
| | * 6a7a52e Lost commit
| |/          (Sue Dakota, 4 days ago)
| * 69d9438 More work for feature
| |         (Sue Dakota, 2 weeks ago)
| * 8f69aba Initial work for feature
|/          (Sue Dakota, 3 weeks ago)
* d824fa9 Fix warnings from the linter
|         (Theo Ristudent, 4 weeks ago)
* 9f782b8 Fix tests flakes
|         (Tess Driven, 5 weeks ago)

由此可见,e3124bf6a7a52e是未引用的孤儿,并且它们的祖先提交具有上下文。

答案 3 :(得分:3)

git的一个很好的功能是它可以检测到损坏。但是,它不包括纠错以防止损坏。

我希望您已将此存储库的内容推送到另一台计算机,或者您已备份以恢复损坏的部分。

我对Windows上的git没有任何经验,但在Linux或OS X上从未见过使用git的这种行为。