Как выбрать несколько коммитов cherry-pick
у меня есть две ветви. Совершение a это голова одного, в то время как другой имеет b,c,d,e и f на a. Я хочу двигаться c,d,e и f в первую ветку без фиксации b. Используя вишня выбрать легко: выезд первого отделения выбирают по одному c до f и перебазировать вторую ветку на первую. Но есть ли способ, чтобы выбрать все c -f в одну команду?
здесь визуальное описание сценария (спасибо JJD):

9 ответов:
Git 1.7.2 ввел возможность cherrypick диапазон коммитов. Из заметки:
git cherry-pick " научился выбирать диапазон коммитов (например, " cherry-pick A..B " и "cherry-pick -- stdin"), так же как и " git revert"; они не поддерживают более хороший контроль последовательности " rebase [- i] " имеет, однако.
включая важные комментарии (кредиты соответствующим авторам)
Примечание 1: в "черри-пик А..B " форма, A должна быть старше, чем B. Если они неправильный порядок, команда будет молча терпеть неудачу. – Дэмиан
примечание 2: кроме того, это будет не вишневый выбор A, а скорее все после A до и включая B.-J. B. Rainsberger
Примечание 3: чтобы включить только тип git cherry-pick a^..B-sschaef
самый простой способ сделать это с помощью тега до
rebase. Предположим, что ветвь, ток которой заканчивается наaназывается mybranch и это ветка, которую вы хотите переместитьc-fна.# checkout mybranch git checkout mybranch # reset it to f (currently includes a) git reset --hard f # rebase every commit after b and transplant it onto a git rebase --onto a b
вы можете использовать последовательную комбинацию
git rebaseиgit branchчтобы применить группу коммитов к другой ветви. Как уже опубликовано wolfc первая команда фактически копирует совершает. Однако это изменение не будет видно до тех пор, пока вы не добавите имя ветви в самую верхнюю фиксацию группы.пожалуйста, откройте изображение в новой вкладке ...
чтобы суммировать команды в тексте форма:
- открыть gitk как самостоятельный процесс с помощью команды:
gitk --all &.- выполнить
git rebase --onto a b f.- пресс F5 на gitk. Ничего не меняется. Но нет
HEADпомеченные.- выполнить
git branch selection- пресс F5 на gitk. Появится новая ветка с ее фиксациями.
это следует уточнить вещи:
- Commit
aявляется новым корневым назначением группы.- Commit
bявляется фиксацией перед первой фиксацией группы (exclusive).- Commit
fявляется последним коммитом группы (включительно).затем вы могли бы использовать
git checkout feature && git reset --hard bудалить коммитыcдоfСfeatureфилиала.в дополнение к этому ответу, я написал блоге что описывает команды в другом сценарии, которые должны помочь обычно использовать его.
чтобы применить комментарии J. B. Rainsberger и sschaef, чтобы конкретно ответить на этот вопрос... Чтобы использовать диапазон выбора вишни в этом примере:
git checkout a git cherry-pick b..fили
git checkout a git cherry-pick c^..f
Если у вас есть выборочные изменения для слияния, скажем, A, C, F,J из A,B,C,D,E,F,G,H,I, J commits, просто используйте команду ниже:
git cherry-pick a C F J
на самом деле, самый простой способ сделать это может быть
- сохраните базу слияния между двумя ветвями
MERGE_BASE=$(git merge-base branch-a branch-b)- быстрая перемотка вперед или перебазирование старой ветви на новую ветвь
перебазируйте полученную ветвь на себя, начиная с базы слияния с шага 1, и вручную удалите фиксации, которые не нужны:
git rebase ${SAVED_MERGE_BASE} -iкроме того, если есть только несколько новых коммитов, пропустите шаг 1, и просто используйте
git rebase HEAD^^^^^^^ -iв первом шаге, используя достаточно
^для перемещения мимо базы слияния.вы увидите что-то вроде этого в интерактивной ребазе:
pick 3139276 commit a pick c1b421d commit b pick 7204ee5 commit c pick 6ae9419 commit d pick 0152077 commit e pick 2656623 commit fзатем удалите строки b (и любые другие, которые вы хотите)

Comments