Как чередовать несколько коммитов

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

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

enter image description here

474
04 нояб. '09 в 3:07
источник поделиться
7 ответов

Git 1.7.2 введена способность черви совершать ряд коммитов. Из примечания к выпуску:

Git cherry-pick "научился выбирать диапазон коммитов (например," вишня-выбор A..B "и" cherry-pick -stdin "), так же" gitrevert ", они не поддерживают более хороший контроль последовательности" rebase [-i] ", однако.


Включая важные комментарии (кредиты соответствующим авторам)

Примечание 1: В форме "вишневый выбор A..B" A должен быть старше B. Если это неправильный порядок, команда будет терпеть неудачу. - damian

Примечание 2: Кроме того, это не будет использовать вишневый выбор A, а скорее все после A вплоть до B. - J. B. Rainsberger

Примечание 3: Чтобы включить только тип git вишневый выбор A ^.. B - sschaef

679
14 окт. '10 в 16:08
источник

Связанные вопросы


Похожие вопросы

Самый простой способ сделать это - с опцией onto на 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
77
04 нояб. '09 в 11:13
источник

Или запрошенный однострочный:

git rebase --onto a b f
63
25 мая '11 в 18:12
источник

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

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

Workflow

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

  • Откройте gitk как независимый процесс, используя команду: gitk --all &.
  • Запустите git rebase --onto a b f.
  • Нажмите F5 в gitk. Ничего не меняется. Но не отмечено HEAD.
  • Выполнить git branch selection
  • Нажмите F5 в gitk. Появится новая ветвь с ее коммитами.

Это должно прояснить ситуацию:

  • Commit a является новым корневым местом назначения группы.
  • Commit b - это фиксация перед первым фиксацией группы (исключение).
  • Commit f - последняя фиксация группы (включительно).

Затем вы можете использовать git checkout feature && git reset --hard b для удаления коммитов c до f из ветки feature.

В дополнение к этому ответу я написал сообщение , в котором описываются команды в другом сценарии, которые должны помочь в его использовании.

45
28 сент. '12 в 23:30
источник
git rev-list --reverse b..f | xargs -n 1 git cherry-pick
16
04 нояб. '09 в 6:59
источник

Чтобы применить комментарии Дж. Б. Рэйнсбергера и sschaef, чтобы конкретно ответить на вопрос... Использовать диапазон вишни в этом примере:

git checkout a
git cherry-pick b..f

или

git checkout a
git cherry-pick c^..f
13
26 июля '15 в 21:25
источник
git format-patch --full-index --binary --stdout range... | git am -3
5
04 нояб. '09 в 4:08
источник

Посмотрите другие вопросы по меткам или Задайте вопрос