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 совершить.

Я не знаю, возможно ли это. После сквоша вы должны сделать вторую интерактивную перебазировку и затем изменить коммит.

Другие вопросы по тегам