Я перебазирую ветку 2 на более новую версию ветки 1. Были некоторые конфликты, поэтому я сделал слияние и git add
ed конфликтующий файл. Но затем, вместо git rebase --continue
, я нажал на свой терминал и, не задумываясь, нажал ввод для git rebase --skip
. Будет ли конфликт успешно разрешен, или git вернется к одной из версий из-за флага --skip
?
Git: Что делать, если случайно пропустили при перебазировании?
Ответы (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>
, чтобы найти скопированные с перебазированием коммиты с их разрешениями, а также вырезать и пропустить их хэш-идентификаторы.