Подтвердить что ты не робот

Git синтаксис вихревой выборки и объединения

Итак, я уже делал бесчисленное количество черешни, и мне кажется, что я сейчас не могу справиться с этим, я пытаюсь выбрать из одной ветки в другую, что должно быть легко, как бы то ни было, я ошибаюсь было получено слияние, но не -m?

$ git cherry-pick a8c5ad438f6173dc34f6ec45bddcef2ab23285e0
error: Commit a8c5ad438f6173dc34f6ec45bddcef2ab23285e0 is a merge but no -m option was given.
fatal: cherry-pick failed

Это выглядит неправильно... должно быть:

$ git cherry-pick a8c5ad438f6173dc34f6ec45bddcef2ab23285e0

Так как, когда мне нужно предоставить функцию -m?

4b9b3361

Ответ 1

Вы должны указать -m, если коммит является фиксацией слиянием, т.е. фиксацией с несколькими родителями.

Обычно, что git cherry-pick REV может быть описано как:

  • Возьмите изменения между rev и его родителем.

  • Примените эти изменения к текущему HEAD и зафиксируйте результат с сообщением фиксации rev.

Согласование слияния объединяет две линии разработки. Например, одна строка реализует виджет, а другая строка удаляет беспорядок. Слияние дает вам код с виджетами, без помех.

Теперь рассмотрим шаг # 1 процесса вишневого выбора: git не может догадаться, хотите ли вы удалить беспорядок или реализовать виджет. Вы также не можете сделать то и другое, потому что информация о том, как сделать это, не содержится внутри одного слияния, только содержимое результирующего объединенного дерева.

Параметр -m позволяет вам сообщить git, как действовать. Например, если удаление помех произошло в master, и слияние слиянием было создано с помощью git merge WIDGET, тогда git cherry-pick -m 1 merged-commit будет вишня-выбрать новый виджет, потому что diff между объединенным деревом и родительским 1 (последний из удаляющих помех коммитов ) будет именно добавлением виджета. С другой стороны, git cherry-pick -m 2 merge-commit удалит беспорядок, потому что разница между родительским 2 (последним из коммитов добавления виджета) и слиянием-коммит - это именно удаление беспорядка, отсутствующее в ветке виджета.

Ответ 2

git запрашивает указать родительский номер (-m), потому что у вашего слияния есть два родителя и git не знаю, какую сторону слияния следует считать магистральный. Таким образом, используя этот параметр, вы можете указать родительский номер (начиная с 1) основной линии и вишневый выбор, чтобы воспроизвести изменение относительно указанного родителя.

Чтобы узнать своих родителей, попробуйте либо:

git show --pretty=raw <merge_commit>

или

git cat-file -p <merge_commit>

или даже для лучшей видимости GUI, попробуйте:

gitk <merge_commit>

В результате вы должны получить что-то вроде:

commit fc70b1e9f940a6b511cbf86fe20293b181fb7821
tree 8d2ed6b21f074725db4f90e6aca1ebda6bc5d050 
parent 54d59bedb9228fbbb9d645b977173009647a08a9 = <parent1_commit>
parent 80f1016b327cd8482a3855ade89a41ffab64a792 = <parent2_commit>

Затем проверьте все ваши родительские данные на:

git show <parent1_or_2_commit>

Добавьте --stat, чтобы просмотреть список измененных файлов.

Или используйте следующую команду для сравнения изменений (на основе вышеописанного родителя):

git diff <parent1_or_2_commit>..<commit>

Добавьте --stat, чтобы просмотреть список измененных файлов.

или используйте комбинированный diff для сравнения двух родителей:

git diff --cc <parent1_commit>
git diff --cc <parent2_commit>

Затем укажите родительский номер, начинающийся с 1 для вашего вишневого выбора, например

git cherry-pick -m 1 <merge_commit>

Затем запустите git status, чтобы узнать, что происходит. Если вы еще не хотите зафиксировать изменения, добавьте параметр -n, чтобы узнать, что произойдет. Тогда, когда вы не счастливы, reset в HEAD (git reset HEAD --hard). Если вы столкнетесь с конфликтами git, вам, вероятно, придется их вручную решить или указать стратегию слияния (-X), см. Как разрешить конфликты слияния в Git?

Ответ 3

Лично, что я обычно делаю, так как слияние объединяет 2 коммита, например, если у меня есть слияние с фиксацией C, которая состоит из двух родителей, например, commit A в master и commit B из другой ветки, получающей объединение, если мне нужно вишня выбирает слияние, я бы не потрудился с запутанной командой, чтобы вишня выбрала фиксацию слияния, но вместо этого я просто вишню каждого из родителей A и B индивидуально, это также полезно в ситуации, когда вы только хотите, чтобы cherry pick commit B только в том случае, если фиксация A от мастера была уже выбрана вишней в ветку, а вишня - до того, как произошло слияние.

Ответ 4

Синтаксис с man-страниц выглядит следующим образом:

git cherry-pick [--edit] [-n] [-m parent-number] [-s] [-x] [--ff] <commit>...

Родительское число относится к:

-m parent-number, -mainline parent-number. Обычно вы не можете использовать вишневое слияние, потому что не знаете, какую сторону слияния следует считать основной. Эта опция указывает родительский номер (начиная с 1) основной линии и позволяет вишневому заводу воспроизводить изменение относительно указанного родителя.

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

Ответ 5

Попробуйте объединить результат:

git cherry-pick ....
git mergetool
git cherry-pick --continue