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?
Ответы
Ответ 1
Вы должны указать -m
, если коммит является фиксацией слиянием, т.е. фиксацией с несколькими родителями.
Обычно, что git cherry-pick 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