Git cherry-pick синтаксис и слияние ветвей


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

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

это выглядит wrong.......it должно быть:

$ git cherry-pick a8c5ad438f6173dc34f6ec45bddcef2ab23285e0

С каких пор я должен поставлять функцию a-m?

5 51

5 ответов:

вы должны поставить -m Если фиксация является merge commit, т. е. фиксация с более чем одним родителем.

нормально, что git cherry-pick REV does можно описать как:

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

  2. примените эти изменения к текущей головке и зафиксируйте результат с помощью revсообщение о фиксации.

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

теперь рассмотрим Шаг №1 процесса cherry-pick: git не может угадать, хотите ли вы удалить беспорядок или реализовать виджет. Вы также не можете сделать и то, и другое, потому что информация о том, как сделать и то, и другое, не содержится внутри одной фиксации слияния, а только содержимое результирующего объединенного дерева.

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

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

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

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 возможность увидеть, что происходит. Затем, когда вы не счастливы, перезагрузите голову (git reset HEAD --hard). Если вы получите конфликты git, вам, вероятно, придется решать их вручную или укажите стратегию слияния (-X), см.: как разрешить конфликты слияния в Git?

лично, что я обычно делаю в том, что после слияния совместная 2 совершает, например, если у меня фиксация слияния C, которая состоит из 2 родителей е.г совершить в Мастер и совершить в другой ветке становится слился, если мне нужно, чтобы вишня выбрать "слияние" я бы не стал заморачиваться с толку команду, чтобы вишня выбрать фиксацию себе, но вместо этого я бы просто вишня каждый из родителей A и B по отдельности, это также полезно в ситуации, когда вы только хотите, чтобы вишня выбрать совершают Б только в случае, если commit a от мастера уже был выбран вишней на ветку, один из них выбирает вишню до того, как произошло слияние.

синтаксис из справочных страниц выглядит следующим образом:

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

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

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

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

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

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