RUDE

Как восстановить после того, как git rebase был прерван

Я пытаюсь объединить обратную связь ветки с мастером, используя «git checkout feedback» и «git rebase master». Во время выполнения перезагрузки питание компьютера отключилось, прервав процесс. Теперь приглашение экрана 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

В ветку обратной связи было внесено большое количество изменений. Коллега недавно обновил основную ветку, добавив в нее вариант ветки обратной связи. Что мне нужно сделать, чтобы безопасно объединить мою версию ветки обратной связи с основной?

Следуя предложению в комментарии

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

749
1

Ответ:

Решено

Потеря питания компьютера во время перезагрузки, вероятно, является одной из худших вещей, которые могут произойти с вашим репозиторием. Похоже, что база данных находится в несогласованном состоянии, поэтому инструменты действительно не знают, как двигаться вперед или назад.

Самая большая подстраховка с git в такой ситуации - это удаленное репо ... если, то есть, в какой-то момент все было отправлено. Если это так, всегда есть возможность просто уничтожить локальное репо и снова клонировать его из источника. Но если при этом будет потеряно слишком много данных - то есть, возможно, ваша версия feedback имеет коммиты, которые не были отправлены, - вы можете попробовать другие вещи.

С этого момента вы рассчитываете на то, что rebase является неразрушающей операцией; он добавляет новые объекты в базу данных, но не удаляет существующие. (Мы могли бы также сказать, что это не редактировать каких-либо объектов, но это избыточно; объекты git нельзя редактировать.) Конечно, потеря мощности все еще затрудняет Конечно, но это помогает понять, что mid-rebase он, вероятно, писал свободные объекты вместо обновления файлов пакетов и т. д. Кроме того, я ожидал, что он еще не обновил feedback ref.

Итак, следующее, что я бы попробовал, это

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

Теперь у вас должна быть ветка feedback в новом репозитории, который не должен был улавливать какие-либо повреждения от прерванной операции rebase.

Вы можете покопаться и убедиться, что все есть; и как только все будет в порядке, вы можете выбросить сломанное репо, повторно клонировать его из источника, добавить новое репо feedback в качестве временного пульта дистанционного управления к новому клону, получить ветку feedback, а затем избавиться от репо feedback.

Затем вы готовы перезапустить rebase (возможно, на этот раз с резервной батареей).

Я не могу гарантировать, что это сработает, но я думаю, что это должно быть. Если этого не произойдет, следующая идея - попытаться восстановить локальное репо, которое у вас есть. Я бы не знал всего, что можно сделать, из головы. Опять же, я бы стремился вывести git из состояния перебазирования и вернуться к состоянию до перебазирования ветви feedback. Поскольку --abort не работает, вам придется вручную обновить метаданные git, и это всегда отчаянное последнее средство.