Как выбрать несколько коммитов cherry-pick



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



здесь визуальное описание сценария (спасибо JJD):



enter image description here

1228   9  

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 --onto a b f

вы можете использовать последовательную комбинацию git rebase и git branch чтобы применить группу коммитов к другой ветви. Как уже опубликовано wolfc первая команда фактически копирует совершает. Однако это изменение не будет видно до тех пор, пока вы не добавите имя ветви в самую верхнюю фиксацию группы.

пожалуйста, откройте изображение в новой вкладке ...

Workflow

чтобы суммировать команды в тексте форма:

  1. открыть gitk как самостоятельный процесс с помощью команды:gitk --all &.
  2. выполнить git rebase --onto a b f.
  3. пресс F5 на gitk. Ничего не меняется. Но нет HEAD помеченные.
  4. выполнить git branch selection
  5. пресс 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
git rev-list --reverse b..f | xargs -n 1 git cherry-pick
git format-patch --full-index --binary --stdout range... | git am -3

Если у вас есть выборочные изменения для слияния, скажем, A, C, F,J из A,B,C,D,E,F,G,H,I, J commits, просто используйте команду ниже:

git cherry-pick a C F J

на самом деле, самый простой способ сделать это может быть

  1. сохраните базу слияния между двумя ветвями MERGE_BASE=$(git merge-base branch-a branch-b)
  2. быстрая перемотка вперед или перебазирование старой ветви на новую ветвь
  3. перебазируйте полученную ветвь на себя, начиная с базы слияния с шага 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

    Ничего не найдено.