Как восстановить прерванную ребазу - PullRequest
1 голос
/ 24 июня 2019

Я работал над списком перебазировок и сделал git add, внес изменения, затем rebase --continue.

однако во время этого я случайно набрал rebase --abort.

Я хочу продолжить делать ребаз, который я случайно прервал, поэтому я сделал git reflog

, а затем

git reset --hard HEAD@{2}

Проблема в том, что если я наберу git rebase --continue, он говорит, что у меня нет прогресса в процессе и что я

have 1 and 10 different commits each, respectively (use "git pull" to merge the remote branch into yours)

В любом случае я могу вернутьсяи продолжить ребаз или мне нужно вытащить из ветки и переделать?

1 Ответ

0 голосов
/ 25 июня 2019

Перво-наперво: вы не хотите сделать git pull в этот момент.Вы можете восстановиться, даже если вы это сделали, но это приведет вас в неправильном направлении [1].

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

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

Насколько я знаю, на самом деле нет способа перезапустить перебазу, которая была прервана.Но вы можете аппроксимировать его, используя rebase --onto.

(a) из кончика старого ребазэ (где вы его сбросили), создать тег

(b) и вернуться туда, гдеветка была перед ребазой.(Вы можете снова найти это в журнале; это то место, куда вас отправил rebase --abort.)

(c) сейчас, предположим, что у вас есть

x -- A -- B -- C -- D <--(branch)
 \
  x -- x -- o <--(master)
             \
              A' -- B' <-rebase_tag

, где rebase_tag - тегВы создали в конце старой попытки перебазирования, поэтому A' - это перезапись A, B' - это перезапись B, и вам все равно нужно переписать C и D.

Что вы хотите сделать, это переписать C и D на B'.Так что

git rebase --onto rebase_tag branch~2 branch

Здесь branch~2 можно заменить любым выражением, которое разрешается до B (последний из оригинальных коммитов, который был переписан в предыдущей попытке перебазировки).

Конечно, если работа, связанная с первоначальной попыткой перебазирования, минимальна - если это не заняло много времени и не было много сложного разрешения слияния - вы могли бы просто перезапустить с нуля,Даже делая это, вы можете использовать «старые переписанные коммиты» в качестве ссылки при разрешении конфликтов.

Но если вам понятно, как рассчитать выражение для параметра --onto, вышеприведенное, вероятно, самый простой способ«перезапустить» ребаз.


[1] Здесь нужно понять, что некоторые команды git дают очень подробный / конкретный совет;но этот совет написан для рассмотрения общих случаев использования, когда вы делали определенные вещи, которые, как они предполагают, будет делать новый пользователь.Хорошо, что вы делаете вещи, которые не соответствуют этим предположениям, но они предполагают, что любой, кто знает, знает достаточно, чтобы не нуждаться в конкретном / подробном совете.

Итак, что случилось, вы сделали что-то за пределами этихпредположения, поэтому pull совет не применяется;если вы будете следовать ему, вы будете двигаться в неправильном направлении.Не то чтобы вы все еще не могли выздороветь - вы могли бы - но это было бы еще более запутанным.

...