У меня есть две ветви. Commit a
является главой одного, а другие имеют b
, c
, d
, e
и f
на вершине a
. Я хочу двигаться c
, d
, e
и f
к первой ветви без фиксации b
. Использование вишни забрать его легко: фотографии первой ветви вишневого выбрать один за другим c
до f
и перебазироваться вторую ветвь на первой. Но есть ли способ черри все c
- f
в одной команде?
Вот визуальное описание сценария (спасибо JJD ):
git
git-rebase
cherry-pick
салить
источник
источник
b
основыватьсяf
позже, но это не имеет ничего общего с сбором вишни.)Ответы:
В Git 1.7.2 появилась возможность вишни выбирать диапазон коммитов. Из примечаний к выпуску :
Чтобы выбрать все коммиты из
A
коммитаB
(гдеA
он старшеB
), выполните:Если вы хотите игнорировать саму A, запустите:
(Благодарность достается Дамиану, Дж. Б. Рейнсберге и Сшауфу в комментариях)
источник
git cherry-pick A^..B
git cherry-pick f~3
затемgit cherry-pick f~2
и т. Д. Доgit cherry-pick f
(нажатие стрелки вверх возвращает предыдущую команду, поэтому я могу быстро изменить номер и запустить это должно быть похоже на большинство консолей).git cherry-pick master..somebranch
выберет все коммиты на некоторой ветви начиная с master (при условии, что он уже перебазирован на master), и примените их к текущей ветке.Самый простой способ сделать это с
onto
опциейrebase
. Предположим, что ветвь, в которой заканчивается текущийa
, называется mybranch, и это ветвь, на которую вы хотите перейтиc
-f
.источник
git checkout secondbranch && git rebase mybranch
для полного ответаrebase
интерактивный режим. Спасибо, @Charles!--interactive
для удаления некоторых коммитов из последовательности или переупорядочить их до «выбора вишни». +1b
в этом примере), но да, это сработало для меня.Или запрашиваемый однострочный
источник
Вы можете использовать последовательную комбинацию
git rebase
и,git branch
чтобы применить группу коммитов к другой ветви. Как уже сообщал wolfc, первая команда фактически копирует коммиты. Тем не менее, изменение не будет видно, пока вы не добавите имя ветви в самый верхний коммит группы.Пожалуйста, откройте картинку в новой вкладке ...
Чтобы суммировать команды в текстовом виде:
gitk --all &
.git rebase --onto a b f
.HEAD
отмечен.git branch selection
Это должно прояснить вещи:
a
- это новое корневое назначение группы.b
- это фиксация перед первым коммитом группы (эксклюзив).f
является последним коммитом группы (включительно).После этого вы можете использовать
git checkout feature && git reset --hard b
для удаления коммитовc
доf
изfeature
ветви.В дополнение к этому ответу я написал сообщение в блоге, в котором описываются команды в другом сценарии, которые должны помочь в общем его использовании.
источник
git rebase --onto a b mybranch
и, кстати, - какая программа делает эти классные картинки git?Чтобы применить комментарии JB Rainsberger и sschaef, чтобы конкретно ответить на вопрос ... Чтобы использовать диапазон выбора вишни в этом примере:
или
источник
git 2.7.0.windows.1
и заметил, что когда я пытаюсь выбрать диапазонgit cherry-pick --continue | --abort | --quit
коммитов cherry, все в порядке, но git нигде не говорит вам, что вы должны сделать, прежде чем попытаться снова сделать коммит / cherry-pick. Так что, если вы выбираете диапазон коммитов, вам нужно будет запускатьgit cherry-pick --continue
каждый раз, когда вы будете готовы (разрешать конфликты или тому подобное) с коммитом из данного диапазона.^
После того , как с на самом деле означает «фиксация , прежде чем с» , который является б в данном случае. Вот почемуc^..f
это синонимb..f
. Попробуйте выполнить,git log c^..f
и вы должны увидеть коммиты от c до f, точно так же, как если бы вы это делалиgit log b..f
Если у вас есть выборочные ревизии для объединения, скажем, A, C, F, J из коммитов A, B, C, D, E, F, G, H, I, J, просто используйте команду ниже:
источник
источник
git cherry-pick {hash of c}; git cherry-pick {hash of d}; ...
Чтобы выбрать вишню от идентификатора коммита до кончика ветви, вы можете использовать:
git cherry-pick commit_id^..branch_name
источник
Другой вариант, о котором стоит упомянуть, это то, что если вам нужны последние
n
коммиты из ветви,~
может быть полезен синтаксис:В этом случае приведенная выше команда выберет последние 4 коммита из вызываемой ветви
some-branch
(хотя вы также можете использовать хеш коммита вместо имени ветви)источник
На самом деле, самый простой способ сделать это может быть:
MERGE_BASE=$(git merge-base branch-a branch-b)
перебазировать полученную ветвь на себя, начиная с базы слияния с шага 1, и вручную удалить коммиты, которые не нужны:
В качестве альтернативы, если есть только несколько новых коммитов, пропустите шаг 1 и просто используйте
на первом этапе, используя достаточно,
^
чтобы пройти мимо базы слияния.Вы увидите нечто подобное в интерактивной перебазе:
Затем удалите строки b (и любые другие, которые вы хотите)
источник
источник
Вот скрипт, который позволит вам выбрать несколько коммитов подряд, просто сообщив скрипту, какие исходные и целевые ветви для выбора вишни и количество коммитов:
https://gist.github.com/nickboldt/99ac1dc4eb4c9ff003a1effef2eb2d81
Чтобы выбрать вишню из вашей ветки к мастеру (в качестве источника используется текущая ветка):
Чтобы выбрать последние 5 коммитов из вашей ветки 6.19.x, выполните следующие действия:
источник