Я пытаюсь объединить обратную связь ветки с мастером, используя «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
Потеря питания компьютера во время перезагрузки, вероятно, является одной из худших вещей, которые могут произойти с вашим репозиторием. Похоже, что база данных находится в несогласованном состоянии, поэтому инструменты действительно не знают, как двигаться вперед или назад.
Самая большая подстраховка с 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, и это всегда отчаянное последнее средство.