Как выбрать несколько коммитов
у меня две ветви. Commit a
глава одна, а в другой b
, c
, d
, e
и f
на a
. Я хочу двигаться c
, d
, e
и f
в первую ветку без фиксации b
. С помощью cherry pick это легко: оформить заказ первой ветви cherry-pick по одному c
to f
и rebase второй ветки на первую. Но есть ли способ, чтобы выбрать все c
-f
в одну команду?
здесь визуальное описание сценария (спасибо JJD):
9 ответов
Git 1.7.2 представила возможность cherrypick диапазон коммитов. От заметки:
git cherry-pick " научился выбирать диапазон коммитов (например, " cherry-pick A..B " и "cherry-pick-stdin"), так же как и " git revert"; они не поддерживают более хороший контроль последовательности " rebase [- i] " имеет, однако.
включая важные комментарии (кредиты соответствующим авторам)
Примечание 1: в "cherry-pick A..B " форма, A должна быть старше B. Если они неправильный порядок, команда будет молча терпеть неудачу. - Дэмиан!--3-->
примечание 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
. - пресс Ф5 на gitk. Ничего не меняется. Но нет!--4--> помеченные.
- выполнить
git branch selection
- пресс Ф5 на gitk. Появится новая ветвь со своими фиксациями.
это следует уточнить вещи:
- фиксация
a
является новым корневым назначением группы. - фиксация
b
является фиксацией перед первым фиксацией группы (эксклюзив). - фиксация
f
является последним коммитом группы (включительно).
после этого вы можете использовать git checkout feature && git reset --hard b
удалить коммиты c
до f
С feature
филиала.
в дополнение к этому ответу, я написал блоге что описывает команды в другом сценарии, которые должны помочь обычно использовать его.
применить комментарии J. B. Rainsberger и sschaef, чтобы конкретно ответить на вопрос... Чтобы использовать диапазон cherry-pick в этом примере:
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-выберите 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 (и любые другие, которые вы хотите)