Когда дело доходит до ряда коммитов, сбор вишни является было не практично.
Как упомянуто ниже по Киту Киму , Гит 1.7.2+ появилась возможность производить выбор диапазона коммитов (но вы все равно должны быть осведомлены о результате вишневого выбора для будущего слияния )
git cherry-pick «научился выбирать диапазон коммитов
(например,« cherry-pick A..B»и« cherry-pick --stdin»), так же как и« », однако git revertони не поддерживают более приятный контроль секвенирования» rebase [-i]».
Дамиан комментирует и предупреждает нас:
В « cherry-pick A..B» форме, Aдолжно быть старшеB .
Если они в неправильном порядке, команда молча провалится .
Если вы хотите , чтобы выбрать диапазон Bчерез D(включительно) , что будет B^..D.
См. « Git create ветка из диапазона предыдущих коммитов? » В качестве иллюстрации.
Как Джубобс упоминает в комментариях :
Это предполагает, что Bэто не корневой коммит; unknown revisionиначе вы получите ошибку " ".
Примечание: начиная с Git 2.9.x / 2.10 (3 квартал 2016 года), вы можете выбрать диапазон коммитов непосредственно для сиротской ветви (пустой заголовок): см. « Как сделать существующую ветку сиротой в git ».
Оригинальный ответ (январь 2010 г.)
Было rebase --ontoбы лучше, если бы вы воспроизводили заданный диапазон коммитов поверх ветки интеграции, как здесь описал Чарльз Бэйли .
(также посмотрите «Вот как вы могли бы перенести ветку темы на основе одной ветки в другую» на странице справки git rebase , чтобы увидеть практический пример git rebase --onto)
Если ваша текущая ветвь является интеграцией:
# Checkout a new temporary branch at the current location
git checkout -b tmp
# Move the integration branch to the head of the new patchset
git branch -f integration last_SHA-1_of_working_branch_range
# Rebase the patchset onto tmp, the old location of integration
git rebase --onto tmp first_SHA-1_of_working_branch_range~1 integration
Это будет воспроизводить все между:
- после родителя
first_SHA-1_of_working_branch_range(отсюда и ~1): первый коммит, который вы хотите воспроизвести
- до "
integration" (указывает на последний коммит, который вы хотите воспроизвести, из workingветви)
на " tmp" (который указывает на то, куда integrationуказывал раньше)
Если при воспроизведении одного из этих коммитов возникает конфликт:
- либо решите это и запустите "
git rebase --continue".
- или пропустите этот патч и вместо этого запустите "
git rebase --skip"
- или отмените все это с помощью "
git rebase --abort" (и верните integrationветку на tmpветку)
После этого rebase --onto, integrationбудет обратно на последнюю фиксацию интеграционного ветви (то есть « tmp» филиал + все записи составляют фиксации)
При сборке вишни или rebase --ontoне забывайте, что это имеет последствия при последующих слияниях, как описано здесь .
Здесь обсуждается чистое « cherry-pick» решение , которое включает в себя что-то вроде:
Если вы хотите использовать патч-подход, то вам подойдут «git format-patch | git am» и «git cherry».
В настоящее время git cherry-pickпринимает только одну фиксацию, но если вы хотите , чтобы выбрать диапазон Bчерез Dкоторый будет B^..Dв мерзавец жаргон, так
git rev-list --reverse --topo-order B^..D | while read rev
do
git cherry-pick $rev || break
done
Но в любом случае, когда вам нужно «воспроизвести» ряд коммитов, слово «воспроизведение» должно подтолкнуть вас к использованию « rebase» функции Git.