Git Interactive ReBase: остановка без фиксации
(TLDR) Есть ли способ в git rebase -i
остановить редактирование без идентификатора коммита?
(/TLDR)
Более длинная версия:
Фон
С git rebase -i
Я получаю текстовый редактор, где я могу определить список команд, начиная с pick COMMIT_ID
на каждой строке.
Один из вариантов - заменить "pick COMMIT_ID" на "edit COMMIT_ID", что означает, что после коммита он прекратит вносить изменения в коммит или выполнять некоторые ручные операции. Тогда я могу продолжить git rebase --continue
,
Из списка опций:
# e, edit = use commit, but stop for amending
Вопрос
Интересно, есть ли возможность остановить редактирование без выбора коммита.
Мотивация / Вариант использования
Например, если я хочу сжать диапазон коммитов, а потом остановиться для некоторых ручных операций, мне придется поставить edit + squash перед тем же идентификатором коммита - что недопустимо.
Вместо этого я бы сделал что-то вроде этого:
pick COMMIT_0 Change some colors
pick COMMIT_1 Make it faster
squash COMMIT_2 Fix a typo in previous commit
squash COMMIT_3 Fix another typo in previous commit
edit
pick COMMIT_4 Refactor some things
pick COMMIT_5 Introduce new options
Такая опция также позволит остановить перед первым коммитом в последовательности.
(Я собирался сказать, что это позволит редактировать до первоначальной фиксации всей истории, но это не так - первоначальная фиксация никогда не является частью последовательности rebase)
Если я делаю это так, git говорит так:
Предупреждение: SHA-1 отсутствует или не является коммитом в следующей строке:
Интересно, что эффект более или менее то, что я хочу, он останавливается, и я могу делать вещи. Но я уверен, что это не намеченный способ сделать это.
2 ответа
У вас есть один, два или три варианта, в зависимости от некоторых обстоятельств.
Первый вариант
Вставить
exec false
или его краткая форма
x false
в точке, где вы хотите остановиться. Как ты можешь знать, exec
запускает команду оболочки в том месте, где она появляется; но если команда завершается с ошибкой, git rebase
останавливается, и команда false
всегда выходит с ошибкой.
Второй вариант
Если вы используете Git 2.20 как минимум (не выпущенный на момент написания), вы можете вставить
break
или его краткая форма
b
в точке, где вы хотите остановиться. Эта команда была введена для той цели, о которой вы просите.
Третий вариант
Отметьте коммит до точки, где вы хотите остановиться edit
вместо pick
, Очевидно, что это не работает, если вы хотите остановить до первого коммита или после squash
или же fixup
совершить.
Я не знаю, возможно ли это. После сквоша вы должны сделать вторую интерактивную перебазировку и затем изменить коммит.