【问题标题】:Browse orphaned commits in Git浏览 Git 中的孤立提交
【发布时间】:2011-01-06 18:15:39
【问题描述】:

我的 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:没有错误,致命:失败锁定参考以进行更新:没有错误”。 “没有错误”一定是一个特别讨厌的错误。所以看起来它还在徘徊,但无法使用,无法杀死。

编辑:超级骗子哦,亲爱的。我已经按照这里的建议进行了一堆解包、重新打包和替换:How to recover Git objects damaged by hard disk failure?,但现在我收到另一个散列报告为损坏,因为像“git status”这样无害的东西。我认为整个事情都被水洗了。 Git 很可爱,但我不应该处理这种事情。

【问题讨论】:

  • 关于git checkout -b lostbranchname - 如果您只关心分支的名称(而不是它的内容),您可以手动删除(或重命名).git/refs/heads/lostbranchname - 这有望解决问题。
  • 而您还没有将这个 git 文件夹推送到的上游?
  • 遗憾的是,它实际上是一种劣质源代码控制系统的替代存储库,我只是在本地使用它来获取 git 的所有功能和细节,而无需其他系统的麻烦。但至少其他系统不会随机破坏自身。尽管如此,这意味着我失去的只是我上次签入另一个系统以来的更改,我已经恢复了。是时候开始一个新的存储库了!
  • 我会毫不犹豫地说 git 让你“处理这种事情”或者它自己损坏了。除了备份之外,没有任何东西可以完全稳定地防止数据丢失。
  • 我真的知道,我只是(自然地)有点生气,因为我失去了我美好的历史。这不是 git 的错,任何其他系统都会出现相同的文件系统错误。

标签: git


【解决方案1】:

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

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

【讨论】:

  • 谢谢。这是我在 github 上尝试拉取孤立拉取请求时唯一找到此信息的地方。解决了我的问题。
  • 以防万一有人想要全部在 gitk:[alias] orphank = !gitk --all --date-order ``git reflog | cut -c1-7``&(编辑:想象那些双反引号,其中单个反引号 - 在这里转义似乎不起作用)
  • 很棒的提示@mbx!能够以图形方式查看孤立提交之间的链接非常有用!
  • @BenHymers 如果我们也能获得类似“rebase/squash”的提交关系的虚线,那就太酷了。我还没有找到这样做的方法。
  • 我在写上面的答案时并不知道 reflog。这是一个非常有用的工具!
【解决方案2】:

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

参见 SZEDER Gábor (szeder)commit 71abeb7(2016 年 6 月 3 日)。
(由 Junio C Hamano -- gitster -- 合并于 commit 7949837,2016 年 7 月 6 日)

reflog:继续遍历 reflog 过去的根提交

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

根据 前面的 reflog 条目的“新”值。

【讨论】:

    【解决方案3】:

    我通常会发现 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 Move fast, break things
    |         (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 Rhys Tudent, 4 weeks ago)
    * 9f782b8 Fix test flakes
    |         (Tess Driven, 5 weeks ago)
    

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

    【讨论】:

    • 刚刚为我节省了几个小时的工作时间!不小心删除了一个本地分支,该分支上有未推送的提交,git reflog --all 没有显示它们,git log --graph --reflog 它们非常明显......
    • 感谢git alias,我怎么从未在其他地方看到过?!不过好像你必须use git config to set them
    • @JivanPal 哎呀!固定。
    • 我为以下内容使用别名,以获得更有吸引力的输出,并使用内联日期以获得更紧凑的输出:git log --graph --all --pretty=format:"%Cred%h%Creset - %Cgreen(%cr)%Creset %s%C(yellow)%d%Creset" --abbrev-commit --date=relative
    【解决方案4】:

    git 的一个好特性是它可以检测损坏。但是,它不包括用于防止损坏的纠错。

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

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

    【讨论】:

      猜你喜欢
      • 2015-02-22
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 2021-01-31
      • 2016-04-17
      • 1970-01-01
      • 2018-03-26
      • 1970-01-01
      相关资源
      最近更新 更多