Как выполнить git rebase -i для диапазона коммитов?

#git #commit #git-branch #rebase #git-rebase

#git #фиксация #git-branch #перебазирование #git-rebase

Вопрос:

Могу ли я сквошить диапазон коммитов для локальной ветки функций / тем, используя перебазирование, которое не включает самую последнюю фиксацию? Это для коммитов, которые я хочу подготовить, прежде чем они будут объединены и отправлены в публичное репозиторий.

Я работал быстро и внес кучу незначительных изменений с плохими названиями и описаниями, которые я хочу разделить на два или три отдельных логических коммита с отличными комментариями. Могу ли я выбрать диапазон коммитов между 329aed9 и af39283, который может быть в любой момент в короткой истории этой ветки функций?

 git rebase -i RANGE_START_COMMIT_ID RANGE_LAST_COMMIT_ID
  

Спасибо!

Комментарии:

1. Если вы используете vim (что по умолчанию делает Git), вы можете использовать режим визуального блока (ctrl-v), чтобы изменить произвольное количество выборов на сжатие одновременно.

2. Спасибо Джефроми. Я, наконец, понял, как выбирать и использовать vim. Для других новичков выполните команду ‘git rebase -i mybranch ~ 5’, где 5 — количество самых последних коммитов для обработки. Если вы хотите, чтобы коммит оставался как есть, оставьте его префикс как «выбрать». В противном случае измените его префикс строки с ‘pick’ на ‘squash’, и rebase будет конденсировать каждый коммит ‘squash’ в первый коммит с надписью ‘pick’ над ним. Если у вас есть 10 коммитов, и вы оставляете три как «выбор», а остальные как «сквош», то после перебазирования вы получите результат в три коммита. Я опубликую скриншот, показывающий, как это работает.

3. Разве это не почти то же самое, что говорится в справке под списком коммитов?

4. Да, но из справки не совсем очевидно, что вы можете использовать pick, чтобы оставить одни коммиты неизменными, одновременно изменяя другие в одной перебазировке. По крайней мере, это было отключением для меня, и, надеюсь, это поможет другим.

Ответ №1:

Вы всегда можете создать новую ветку с git checkout -b new_branch af39283 помощью, а затем перебазировать ее. Однако, если вы хотите включить более поздние коммиты в какой-то момент в будущем, вам также не удастся их перебазировать. Значение SHA1 для коммита зависит от всех его предковых коммитов.

Комментарии:

1. Карл, спасибо за этот совет. Я не понимал, что можно сгенерировать новую ветку до SHA, но я попробовал, и мне понравилось. Если мы говорим о создании четырех разных сквошей, то при таком подходе кажется, что для последних трех сквошей будет создана новая ветка. Исходная ветвь функций будет перебазирована как первый сквош. Наконец, каждый из трех других «git checkout -b new_branch SHA #» будет объединен с исходной веткой функций, чтобы создать великолепную идеальную ветку?

2. Вы хотите сказать, что ваш желаемый конечный результат — это одна ветвь с 3 сжатыми коммит, за которыми следует ваш исходный коммит? Если это так, то в списке коммитов, который появляется при выполнении a rebase -i , вы просто меняете pick значение на reword для каждого из первых коммитов ваших сквошей, выбираете squash для всего остального и оставляете свой нетронутый коммит как pick .

3. @Karl: Вам не нужно перефразировать первые коммиты squashes; Git автоматически позволяет вам редактировать их и предоставляет сообщения всех сжатых коммитов в качестве отправной точки.

Ответ №2:

Итак, не совсем понятно, что вы подразумеваете под «не включая» самый последний коммит, но когда вы делаете rebase -i , вы можете сквош / переупорядочить / переписать / исправить / удалить предыдущие коммиты без необходимости что-либо делать с последним коммитом. Конечно, вы переписываете историю под ним, поэтому его diff будет применен повторно, и после перебазирования это будет другой объект фиксации, но поскольку вы не публиковали это публично (и вы переписываете все остальное), это не должно иметь большого значения.

Комментарии:

1. Спасибо за вашу помощь. «не включая» означало, что я хотел сделать отдельные сквоши, но оставить мой последний коммит без изменений. Самый последний коммит хорош, и я бы хотел, чтобы он оставался независимым (не смешивался с другими). Тогда есть группы примерно из 20 очень маленьких коммитов, которые можно сжать в несколько сжатых коммитов. В итоге требуется около 60 небольших коммитов и создание 4 разумных для объединения в публичное репозиторий.