Git: Что делать, если случайно пропустили при перебазировании?

Я перебазирую ветку 2 на более новую версию ветки 1. Были некоторые конфликты, поэтому я сделал слияние и git added конфликтующий файл. Но затем, вместо git rebase --continue, я нажал на свой терминал и, не задумываясь, нажал ввод для git rebase --skip. Будет ли конфликт успешно разрешен, или git вернется к одной из версий из-за флага --skip?


person cyc115    schedule 18.05.2017    source источник


Ответы (1)


Код перебазирования довольно сложен (и в версии 2.13 интерактивная перебазировка теперь в основном обрабатывается секвенсором, а не git-rebase--interactive.sh, хотя он управляется из git-rebase--interactive.sh). К счастью, --skip довольно прост и частично обрабатывается в сценарии оболочки верхнего уровня, git-rebase.sh, здесь и здесь. Использование --skip заставляет Git запустить git reset --hard HEAD, прежде чем переходить к действию пропуска для определенного типа перебазирования (am, interactive или merge: первые два используют git rerere clear для интерактивных перебазирований и перебазирований слиянием, а последний использует git am --skip для неинтерактивных перебазирований в стиле am). ребазы без слияния).

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

Если вы приложили много усилий к этим разрешениям, вы можете попытаться восстановить висячий BLOB-объект (см. Восстановление висящих BLOB-объектов в git — обратите внимание, что в принятом ответе говорится использовать git show для хеш-идентификаторов, что работает, но если вам нужно выполнить поиск по многим, это проще искать в каталоге .git/lost-found/other; добавленные объединенные файлы будут там, смешанные со всеми остальными висячими блобами, оставшимися в вашем репозитории, которых может быть довольно много). Вероятно, вы также захотите прервать или отменить перебазирование.

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

git rebase --abort          # if it's still in progress, or
git reset --hard ORIG_HEAD  # if it's finished now

чтобы вернуться к состоянию, которое у вас было до того, как вы начали всю эту перебазировку. Затем вы можете обратиться к существующим готовым перебазированным частям, используя name~<number> для обратного отсчета от этого коммита, или запустить git log <name>, чтобы найти скопированные с перебазированием коммиты с их разрешениями, а также вырезать и пропустить их хэш-идентификаторы.

person torek    schedule 18.05.2017
comment
Для быстрого решения - проверьте 2 строки кода из этого ответа. - person Eduard; 13.08.2018