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

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

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

enter image description here

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

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

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

Workflow

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

  1. открыть gitk как независимый процесс с помощью команды: gitk --all &.
  2. выполнить git rebase --onto a b f.
  3. пресс Ф5 на gitk. Ничего не меняется. Но нет!--4--> помеченные.
  4. выполнить git branch selection
  5. пресс Ф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

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-выберите 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 (и любые другие, которые вы хотите)