git rebase中断后如何修复

时间:2018-04-17 15:46:08

标签: git merge rebase

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

$ 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 - 继续显示

$ 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

1 个答案:

答案 0 :(得分:0)

对于计算机在变基期间失去电力可能是您的回购可能发生的最糟糕的事情之一。听起来数据库处于不一致的状态,因此工具实际上不知道如何向前或向后移动。

在这样的情况下,使用git的最大安全网是远程回购...如果,就是说,某些东西都被推到了某个点。如果是这样的话,总会有选项来核实本地仓库并再次从原点进行克隆。但是如果有太多的数据会以这种方式丢失 - 也就是说,如果您的feedback版本的提交没有被推送 - 那么还有其他的东西可以尝试。

从这里开始,你指望rebase是非破坏性的操作;它将新对象添加到数据库,但不删除现有对象。 (我们也可以说,它不会编辑任何对象,但这是多余的; git对象无法编辑。)当然,失去力量仍然很难确定但是,它有助于意识到中间变量可能是写松散的对象而不是更新packfiles等。而且,我希望它还没有更新feedback ref。

接下来我要尝试的是

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

现在你应该在一个新的仓库中拥有你的feedback分支,这个仓库不应该从中断的rebase操作中找到任何损坏。

你可以四处寻找并确保一切都存在;一旦它好了,那么你可以废弃破碎的仓库,从原点重新克隆,将新的feedback仓库添加为新克隆的临时远程,获取feedback分支,然后摆脱feedback回购。

然后您已准备好重新启动rebase(此时可能需要备用电池)。

我无法保证会有效,但我认为应该有效。如果没有,下一个想法是尝试修复你拥有的本地仓库。我不知道一切都要做到最好。同样,我的目标是让git退出rebasing状态并退回到feedback分支的pre-rebase状态。由于--abort不起作用,您必须手动更新git元数据,这总是一种绝望的最后手段。