Якщо мова йде про цілий ряд комітетів, збирання вишні є не було практичним.
Як згадано нижче по Кіту Кіму , Гіт 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 із діапазону попередніх комісій? "
Як згадує Джубобс у коментарях :
Це передбачає, що Bце не кореневий запис; ви отримаєте unknown revisionпомилку " " в іншому випадку.
Зауважте: станом на Git 2.9.x / 2.10 (Q3 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 lingo,
git rev-list --reverse --topo-order B^..D | while read rev
do
git cherry-pick $rev || break
done
Але в будь-якому випадку, коли вам потрібно "повторити" діапазон комітетів, слово "повторити" повинно підштовхнути вас до використання функції " rebase" Git.