git cherry-pick говорит: "... 38c74d-это слияние, но опция no-m не была предоставлена"



Я сделал некоторые изменения в моей главной ветви и хочу принести их вверх по течению. когда я выбираю следующие коммиты, однако я застреваю на fd9f578, где git говорит:



$ git cherry-pick fd9f578
fatal: Commit fd9f57850f6b94b7906e5bbe51a0d75bf638c74d is a merge but no -m option was given.


что git пытается сказать мне, и черри-выбрать правильную вещь, чтобы использовать здесь? Главная ветвь включает изменения в файлы, которые были изменены в восходящей ветви, поэтому я уверен, что будут некоторые конфликты слияния, но это не так уж плохо, чтобы выправить. Я знаю, какие изменения нужно было куда.



Это коммиты, которые я хочу принести вверх по течению.



e7d4cff added some comments...
23e6d2a moved static strings...
44cc65a incorporated test ...
40b83d5 whoops delete whitspace...
24f8a50 implemented global.c...
43651c3 cleaned up ...
068b2fe cleaned up version.c ...
fd9f578 Merge branch 'master' of ssh://extgit/git/sessions_common
4172caa cleaned up comments in sessions.c ...
741   4  

4 ответов:

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

Итак, если фиксация имеет два или более родителей, она также представляет два или более различий - какой из них следует применять?

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

Я не могу точно сказать по вашей конкретной ситуации, но с помощью git merge вместо git cherry-pick обычно рекомендуется. Когда вы вишневый выбор слияния фиксации, он рушится все изменения, внесенные в родитель, который вы не указали -m на совершил. Вы теряете всю их историю, и глом вместе все их различия. Ваш вызов.

@Borealid ответ правильный, но предположим, что вы не заботитесь о сохранении точной истории слияния ветви и просто хотите выбрать ее линеаризованную версию. Вот простой и безопасный способ сделать это:

начальное состояние: вы находитесь на филиал X, и вы хотите вишни-выбрать коммиты Y..Z.

  1. git checkout -b tempZ Z
  2. git rebase Y
  3. git checkout -b newX X
  4. git cherry-pick Y..tempZ
  5. (опционально) git branch -D tempZ

что это делает, чтобы создать ветку tempZ на основе Z, но с историей от Y далее линеаризованный, а затем вишневый выбор, что на копию X под названием newX. (Лучше делать это на новой ветке, а не мутировать X.) Конечно, на шаге 4 могут возникнуть конфликты, которые вам придется решать обычным способом (cherry-pick работает очень похоже rebase в этом отношении). Наконец, он удаляет временный tempZ отделение.

если Шаг 2 дает сообщение "текущая ветвь tempZ обновлена", то Y..Z уже был линейным, поэтому просто проигнорируйте это сообщение и продолжите шаги 3 вперед.

затем комментарий newX и посмотреть, сделал ли это то, что вы хотели.

(Примечание: это не то же самое как простой git rebase X когда на ветке Z, потому что это никак не зависит от отношения между X и Y; могут быть коммиты между общими предок и Y что вы не хотите.)

вот переписывание принятого ответа, который идеально разъясняет преимущества / риски возможных подходов:

вы пытаетесь вишневый выбор fd9f578, который был слиянием с двумя родителями.

вместо вишневого выбора слияния, самое простое-вишневый выбор фиксации(ов), которые вы действительно хотите от каждой ветви в слиянии.

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

объяснение

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

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

варианты

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

  1. (более сложный и неясный; также отбрасывает историю) вы можете указать, какой родитель должен применяться.

    • использовать -m возможность сделать это. Например, git cherry-pick -m 1 fd9f578 будет использовать первый родитель, указанный в слиянии в качестве основа.

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

  2. (проще и привычнее; сохраняет историю) вы можете использовать git merge вместо git cherry-pick.

    • как обычно с git merge, он попытается применить все коммиты, которые существуют в ветке, которую вы объединяете, и перечислить их по отдельности в своем журнале git.

упрощение метода @Daira Hopwood хорошо подходит для выбора одного коммита. Не нужны временные ветки.

в случае автора:

  • Z требуется commit (fd9f578)
  • Y совершает перед ним
  • X текущая рабочая ветвь

затем выполните:

git checkout Z   # move HEAD to wanted commit
git reset Y      # have Z as changes in working tree
git stash        # save Z in stash
git checkout X   # return to working branch
git stash pop    # apply Z to current branch
git commit -a    # do commit

Comments

    Ничего не найдено.