从崩溃中恢复git

从崩溃中恢复git,git,github,gerrit,Git,Github,Gerrit,我的git服务器崩溃,现在我的repo处于不一致状态。 运行git fsck--full显示以下输出 错误:refs/heads/data-8989未指向有效对象! 悬空提交b8cfe9e3e58c64411795cf9676ff228b12607e95 悬空提交A817EF9D4A423B6EFEE62B9AF16979E643394B1 悬空提交4f9d59b0dcfa34dd9592474fe487f568a20b07ea 悬空提交22af4033b6224d2b075db7138801f

我的git服务器崩溃,现在我的repo处于不一致状态。 运行
git fsck--full
显示以下输出

错误:refs/heads/data-8989未指向有效对象!
悬空提交b8cfe9e3e58c64411795cf9676ff228b12607e95
悬空提交A817EF9D4A423B6EFEE62B9AF16979E643394B1
悬空提交4f9d59b0dcfa34dd9592474fe487f568a20b07ea
悬空提交22af4033b6224d2b075db7138801fd7b8244eb37
缺少提交d2b142ca7e165429a47b6e303fad349f3ae51cc7

有没有办法恢复此功能?

来自:

git fsck测试SHA-1和一般对象健全性,并且它完成了完整的测试 跟踪结果的可达性和其他一切。它打印 找出它发现的任何损坏(丢失或损坏的对象),以及如果使用 --unreachable标志还将打印出存在但不可用的对象 无法从任何指定的头节点(或 默认设置(如上所述)

您必须在备份或其他存档中找到的任何损坏对象 (也就是说,您可以删除它们并与其他站点进行rsync 希望别人拥有你损坏的物品)

您需要有一个备份或一些克隆的本地存储库。

即使在一个健康的存储库中,“悬空”提交也是正常的:它们是一组无法访问的提交的提示,通常是由诸如
git-rebase
git-commit-amend
(故意放弃一个或多个“旧”提交以支持“新的和改进的”一个或多个副本)。但是,在有故障的存储库中,这些悬空提交和“后面”可访问的其他提交可能是您可以并且希望恢复的

丢失的提交是一个更严重的问题。鉴于只显示了一个这样的提交,并且只有一个引用,
data-8989
分支无效,丢失的提交很可能是
data-8989
的提示提交。在这种情况下,一个(但只有一个)悬而未决的提交可能是该链后面的一些提交

直观地表示,法线图形可能如下所示:

             o--o--o         <-- feature
            /       \
...--o--o--o------o--*--o    <-- branch1
         \
          o--o-----------o   <-- branch2
              \
               o----o--o     <-- branch3
在这种情况下,我们会收到一个投诉,说缺少提交,因为名称
branch2
上写着“find commit 1234567”或其他什么,但它不在那里。它是我们丢失的

不过,我们不会得到任何悬空提交,因为
branch2
的父提交也在
branch3
上。现在提交只在
branch3
上,而不是在两个分支上,因为传出的向后箭头是我们丢失的提交的一部分

如果我们丢失了
branch1
的提示,我们确实会得到一个悬而未决的提交:

             o--o--o         <-- feature
            /       \
...--o--o--o------o--*   ?    <-- branch1
         \
          o--o-----------o   <-- branch2
              \
               o----o--o     <-- branch3
因此,给定一个损坏的存储库,如果您没有备份或其他克隆来恢复“丢失”的项目,那么明智的做法是停止修改它(不要向其中添加任何内容),并运行
git fsck--lost-found
,让git将任何“悬空”提交保存到
.git/lost-found/commit/
。然后您可以查看这些(通过哈希ID使用
git log
)查看它们是否有价值。git还将无法访问的blob(文件)保存到
.git/lost-found/other/
;您可以使用任何文件查看器直接查看文件内容,并通过这种方式恢复一些丢失的文件

不过,您最好的选择是拥有另一个克隆(或正确的备份)


1但对象可以打包或重新打包,这会影响它们的存储方式,因此这不是一条硬性规定

             o--o--o         <-- feature
            /       \
...--o--o--o------o--*   ?    <-- branch1
         \
          o--o-----------o   <-- branch2
              \
               o----o--o     <-- branch3
             o--o--o         <-- feature
            /
...--o--o--o            ?    <-- branch1
         \
          o--o-----------o   <-- branch2
              \
               o----o--o     <-- branch3