git rebase中断后如何修复

How to repair after git rebase was interrupted

我正在尝试使用 "git checkout feedback" 和 "git rebase master" 将分支反馈与 master 合并。在执行 rebase 时,计算机电源关闭,中断了该过程。现在 git bash 屏幕提示包含:(反馈 | REBASE 1/241)。 Git 状态命令显示

$ git status
On branch feedback
Your branch is up-to-date with 'origin/feedback'.
You are currently rebasing branch 'feedback' on '7a20ac7'.
  (all conflicts fixed: run "git rebase --continue")

nothing to commit, working tree clean

git rebase --continue 显示

$ git rebase --continue
Applying: Not clear why feedback doesn't run now
No changes - did you forget to use 'git add'?
If there is nothing left to stage, chances are that something else
already introduced the same changes; you might want to skip this patch.

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".

git reflog 报告

4bae8c8 HEAD@{0}: commit (merge): Merge branch 'master' into feedback
eca14e3 HEAD@{1}: checkout: moving from 7a20ac7e86823915a4bce205a4baeeff7a7acb7a to feedback
7a20ac7 HEAD@{2}: rebase: checkout master
eca14e3 HEAD@{3}: checkout: moving from 7a20ac7e86823915a4bce205a4baeeff7a7acb7a to feedback
7a20ac7 HEAD@{4}: rebase: updating HEAD
eca14e3 HEAD@{5}: rebase: checkout feedback
7a20ac7 HEAD@{6}: rebase: checkout master
eca14e3 HEAD@{7}: commit: trying to scan a matrix <- last change on branch feedback

对反馈分支进行了大量修改。一位同事最近用反馈分支的变体更新了 master 分支。我需要做什么才能安全地将我的反馈分支版本合并到主版本中?

采纳评论中的建议

john@LAPTOP-CBKOSEPA MINGW64 ~/OneDrive/Documents/GitHub/crNn (feedback|REBASE 1/241)
$ git rebase --abort

john@LAPTOP-CBKOSEPA MINGW64 ~/OneDrive/Documents/GitHub/crNn (feedback)
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: Not clear why feedback doesn't run now
Using index info to reconstruct a base tree...
M       src/rnn/rnn.py
Falling back to patching base and 3-way merge...
error: inflate: data stream error (unknown compression method)
error: unable to unpack c8d57fe6a41234079ebe597c88f33e54b3306a14 header
error: inflate: data stream error (unknown compression method)
fatal: loose object c8d57fe6a41234079ebe597c88f33e54b3306a14 (stored in .git/objects/c8/d57fe6a41234079ebe597c88f33e54b3306a14) is corrupt

在 rebase 期间计算机断电可能是您的 repo 可能发生的最糟糕的事情之一。听起来数据库处于不一致状态,因此工具真的不知道如何向前或向后移动。

在这种情况下,git 最大的安全网是远程仓库...如果所有内容都已在某个时间点推送。如果是这样,总是可以选择核对本地存储库并再次从源克隆。但是,如果有太多数据会以这种方式丢失 - 即,如果您的 feedback 版本可能有未推送的提交 - 您可以尝试其他方法。

从现在开始,您指望 rebase 是一个非破坏性操作;它向数据库添加新对象,但不删除现有对象。 (我们也可以说,它不会 edit 任何对象,但这是多余的;git 对象无法编辑。)当然,失去权力仍然很难 当然,但它有助于意识到 mid-rebase 它可能正在编写松散的对象而不是更新包文件等。而且,我希望它没有更新 feedback还没有参考。

所以接下来我要尝试的是

cd ..
git clone --single-branch --branch feedback file://localhost/path/to/broken/repo feedback

现在您的 feedback 分支应该在一个新的存储库中,它不应该从中断的 rebase 操作中提取任何损坏。

你可以四处看看,确保一切都在那里;一旦一切顺利,您就可以废弃损坏的存储库,从原点重新克隆,将新的 feedback 存储库添加为新克隆的临时远程,获取 feedback 分支,然后摆脱feedback 回购。

然后您就可以重新启动 rebase(这次可能需要备用电池)。

我不能保证它会起作用,但我认为它应该起作用。如果没有,下一个想法是尝试修复您拥有的本地存储库。我不知道该做什么。同样,我的目标是让 git 脱离变基状态并退回到 feedback 分支的变基前状态。由于 --abort 无法正常工作,您必须手动更新 git 元数据,这总是一种不得已的最后手段。

如果 --abort 不工作,你可以使用 git rebase --quit 告诉 git 它不再在 rebase 中而不做任何其他更改,然后使用 reflog,git checkoutgit reset --hard origin/master等进行清理。