Якщо мова йде про цілий ряд комітетів, збирання вишні є не було практичним.
Як згадано нижче по Кіту Кіму , Гіт 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.