2015-09-02 3 views
1

Я прервался в середине долгого интерактивного процесса перебазирования, так как разрешение конфликта пошло ужасно неправильно.git resume rebase using reflog

Я заметил, что reflog имеет ссылки на каждый раз, когда была зарегистрирована git rebase --continue d.

Как я могу возобновить восстановление с последнего успешного --continue так, чтобы сохранились предыдущие разрешения конфликта от rebase? (Если бы я выполнить команду перебазироваться с нуля, я бы вручную разрешить все конфликты, которые я уже разрешённые в первый раз, когда я прошел через него)

Пример:

Пусть интерактивный перебазироваться пошел, как следующим образом (где 000002 проблема была решена успешно и 0000004 был такой полнейшая катастрофа, что перебазироваться была прервана)

edit 000001 Edit to this commit 
pick 000002 Easy merge conflict, resolved 
pick 000003 Commit 3 
pick 000004 Really ugly merge conflict, Abort! 
pick 000005 Commit 5 

reflog теперь выглядит как этот

[email protected]{0}: rebase: aborting 
[email protected]{1}: rebase -i (pick): updating HEAD 
[email protected]{2}: rebase -i (pick): updating HEAD 
[email protected]{3}: rebase -i (edit): updating HEAD 
[email protected]{4}: rebase -i (start): checkout 000000 

То, что я хочу сделать, это git reset --hard [email protected]{1} и продолжить процесс первоначальной перезагрузки, давая «действительно уродливое слияние конфликта» еще одну попытку (и продолжая выбирать 000005).

ответ

1

Rebase не имеет ничего построено, чтобы сделать это, и это немного сложнее сделать это «право», но есть простой способ сделать это «неправильно», создав новой ветви, указывающей на часть перебазироваться Вам полюбились:

$ git branch newbr [email protected]{1} 

Теперь вы можете проверить ветку newbr и использовать git cherry-pick начать в на версии уродливый слияния конфликта. Недостатком является то, что вы должны вручную ввести git cherry-pick набор команд, которые вы хотите ввести (в данном случае 4 и 5).

(После того, как у вас есть все вишневое дерево, выбранное в новую ветку, просто переведите исходную ветвь в новую конечную фиксацию - вот кончик новой ветви - так же, как git rebase будет иметь успех. удалите новый филиал, так как ваша переадресация в ручном режиме завершена.)

+0

Предположим, что в прошлом 000005 существует много истории (или будущего?), которая довольно сложна (в том числе объединение происходит из других ветвей и т. д.). Нет ли более простого способа, чем повторять всю последовательность 'git cherry-pick' и' git merge'? – arcyqwerty

+0

Используя подобный подход, если мне еще рано вставать вопрос о rebase, было бы легче создать новую ветку и снова запустить ту же команду rebase, используя 'git checkout' для разрешения слияний на этом пути? Будет ли это создавать какие-нибудь странные истории, указывающие на осиротевшие refase refs? – arcyqwerty

+0

@arcyqwerty: интерактивная перестановка * - это серия черешни. Вот почему слово в директивах - «выбрать». Rebasing обычно удаляет слияния; интерактивная перебаза позволяет вам сохранять их, но метод, которым он это делает, полна волосатых угловых случаев. См. Скрипт rebase, например, 'vim $ (git --exec-path)/git-rebase - interactive'. «Неправильный» метод работает, потому что мы создаем новую ветвь, совет которой является последней фиксацией, сделанной вами перед тем, как отказаться от усилий по переадресации, т. Е. Мы просто наклеиваем ярлык на анонимную ветку до сих пор. – torek

Смежные вопросы