GIT Rebase操作被电脑崩溃中断。现在仓库不可用。

10

我在我的代码库里有两个分支。它们都没有未提交的更改。

我拉取了branch1,切换到branch2,并开始在branch1上对branch2进行重新基础操作。
在工作中途,我的电脑崩溃了。

最终启动后,我打开GitExtensions发现我的代码库完全为空,我看到闪烁的'rebase under way'或类似的东西,我点击它,它弹出了一个窗口,让我选择解决冲突,这本不应该发生。如果我点击“解决”,它会打开应该显示冲突文件的窗口,当然没有冲突文件显示。

我试图点击放弃 rebase,但它说该文件夹不是git仓库或任何父级。

从那时起,我什么都做不了。我不能放弃,也不能查看提交记录。打开git bash只告诉我/some/path/to repo/repo name ((...) | REBASE )

当我写git status时,它说这不是一个仓库。

好吧,我不会过于在意失败的rebase,但我注意到我的所有源文件都变成二进制文件了,这意味着,除非你们能帮我恢复,否则我的未推送提交就丢失了。

我想重新基础分支并推送它...这很令人沮丧。

编辑1:

.git目录在代码库目录中(/some/path/to_repo/repo_name/.git)。这是应该的。 电脑在重新应用branch2提交时崩溃了。这意味着branch1的提交已经被应用到了branch2,唯一剩下的就是完成应用branch2的提交。在大约应用了10或20个提交后它崩溃了。

现在我已经比较了克隆的代码库和崩溃的代码库的.git目录。

克隆的代码库有以下文件夹:
hooks
info
logs
objects
refs
以及以下文件:
config
description
HEAD
index

packed-refs

崩溃的一个有额外的文件夹名为rebase-apply,还有额外的文件:
COMMIT_EDITMSG
FETCH_HEAD
ORIG_HEAD

其他的似乎都匹配。我没有深入进入文件夹,也没有尝试比较文件内容。


1
.git目录在哪里?里面有什么?除非git在写入repo时被中断(这种情况并不经常发生),否则repo不应该损坏。 - nneonneo
我已经添加了额外的信息作为编辑,请查看并告诉我是否需要提供更多信息。 - user1651105
1
通常情况下,git会说如果HEAD不存在,则在rebase过程中HEAD将包含一个原始的SHA-1值,可能包含一个损坏的值,或者根本没有值? 在这种情况下,放置一个有效的HEAD可能会让你到达下一步。 - torek
1个回答

17

检查了 .git 目录文件后,我注意到 ORIG_HEAD 和 HEAD 文件只包含 NULL。看来我终于找到了解决方法。

  1. 删除 index 文件。
  2. 删除 ORIG_HEAD 文件。
  3. 删除 HEAD 文件。
  4. 复制 FETCH_HEAD(它指向 Branch1)。
  5. 将该副本重命名为 HEAD
  6. 打开 GIT Bash
  7. 导航到仓库目录。
  8. 运行 git status 命令以检查其是否将该目录视为仓库(是的)。
  9. 运行 git reset 命令。
  10. 运行 git rebase --abort 命令。

此时,所有二进制源文件都变成了文本文件。此外,index 文件也被重新创建。

当我通过 GitExtensions 打开仓库时,一切似乎都恢复正常了,就像重新应用之前一样。我尝试了再次进行衍合操作,但它在其中一个提交处停止,并显示以下错误:
error: unable to unpack d447b241eba771f175cb2150eec77ec605a86486 header error: inflateEnd: stream consistency error (no message) fatal: d447b241eba771f175cb2150eec77ec605a86486 is not a valid object

  1. 我将仓库(从本地 GIT 服务器)克隆到另一个文件夹中。
  2. 将恢复的仓库中的源文件复制到新克隆的仓库中。
  3. 检查它是否向我显示了我所做的所有更改都是正确的,没有丢失提交。
  4. 将所有更改作为 1 个提交进行了提交(好吧)。
  5. 推送。

好的,现在它又可以工作了。看起来我没有对它造成任何损害。


这简直救了我的命。 - Brian Hauger
我的评论和Brian一样!Ufff,这个回答没有足够的+1。 - Erlis Vidal
兄弟,你也救了我的命。如果可以的话,我会给你+50的。 - JNYRanger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接