浏览Git中的孤立提交


102

我的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说“错误:无法解析引用refs / heads / lostbranchname:无错误,致命:失败锁定参考以进行更新:没有错误”。“无错误”必须是特别讨厌的错误。因此,看起来它仍在徘徊,但无法使用且无法杀死。

编辑:超级骗子哦亲爱的。我已经按照这里的建议进行了许多拆包,重新包装和替换工作:如何恢复由于硬盘故障而损坏的Git对象?,但现在我又收到另一个哈希已报告为已损坏的哈希表,其含义与“ git status”一样无害。我认为整个事情都在进行。Git非常可爱,但我不必处理这种事情。


关于git checkout -b lostbranchname-如果您只关心分支的名称(而不关心分支的内容),则可以手动删除(或重命名).git/refs/heads/lostbranchname-希望可以做到这一点。
安东尼·哈奇金斯

1
而且您没有将git文件夹推送到的上游?
Lakshman Prasad 2010年

1
遗憾的是,它实际上是一个劣等源代码控制系统的替代存储库,我只是在本地使用它来获取git的所有功能和优点,而又不会给其他系统带来麻烦。但是至少其他系统不会随机破坏自身。尽管如此,这意味着自从我上次签到另一个已经恢复的系统以来,所做的所有更改都是我丢失的。是时候开始一个新的仓库了!
本·海默斯

7
我会毫不犹豫地说git使您“处理这种事情”,或者它破坏了自身。除备份外,没有什么可以完全稳定地防止数据丢失。
卡斯卡贝尔

1
我真的知道,我只是(自然地)对我失去了美好的历史感到有些m愧。这不是git的错,任何其他系统都会在给定的文件系统错误下表现相同。
本·海默斯

Answers:


134

我认为我会给我自己的问题一个答案,而不是让它开放。使用git reflog --all是浏览孤立提交的好方法-使用SHA1哈希可以重建历史记录。

但就我而言,存储库已损坏,因此这无济于事。git fsck可以帮助您找到并有时修复存储库本身中的错误。


3
谢谢。这是我尝试在github上拉一个孤立的拉取请求时找到此信息的唯一地方。解决了我的问题。
SystemParadox 2012年

6
万一有人在gitk中想要全部:([alias] orphank = !gitk --all --date-order ``git reflog | cut -c1-7``&编辑:想象那些双反引号,其中单反引号-转义在这里似乎不起作用)
mbx 2015年

1
很棒的提示@mbx!能够以图形方式查看孤立提交之间的链接非常有用!
本·海默斯,2015年

@BenHymers很棒,如果我们也可以为类似“ rebase / squash”的提交关系使用虚线。我还没有找到做那件事的方法。
mbx 2015年

当我写下上面的答案时,我不了解reflog。这是一个有用的工具!
Jamey Hicks

17

使用Git 2.9.x / 2.10(Q3 2016),你就不必用git reflog --all了,git reflog也就足够了。

提交71abeb7(2016年6月3日)由SZEDER的Gabor( )szeder
(由Junio C gitsterHamano合并--7949837号提交中,2016年7月6日)

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

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

根据前面的reflog条目的“ new”值,继续使reflog经过此类创建事件。


4

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

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

我没有在Windows上使用git的经验,但是从未在Linux或OS X上看到过git的这种行为。


2

我通常会发现git reflog输出令人困惑。对我来说,从git log --graph --reflog以下位置理解提交图要容易得多:

$ git 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, 4 days ago) (origin/master, master)
* 3c4fb9c Break the build
|         (Alyssa P. Hacker, 4 weeks 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, 4 weeks ago)
* d824fa9 Fix warnings from the linter
|         (Theo Ristudent, 4 weeks ago)
* 9f782b8 Fix tests flakes
|         (Tess Driven, 4 weeks ago)

很明显,e3124bf6a7a52e是未引用的孤儿,并且祖先提交的内容中包含上下文。


刚才为我节省了数小时的工作损失!不小心删除了一个未执行提交的本地分支,git reflog --all没有显示它们,而且git log --graph --reflog它们非常明显...
Adam.Er8
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.