Когда дело доходит до ряда коммитов, сбор вишни является было не практично.
Как упомянуто ниже по Киту Киму , Гит 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.