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 ...
4 ответов:
способ работы cherry-pick заключается в том, чтобы взять diff, который представляет собой набор изменений (разница между рабочим деревом в этой точке и рабочим деревом его родителя), и применить его к вашей текущей ветви.
Итак, если фиксация имеет два или более родителей, она также представляет два или более различий - какой из них следует применять?
вы пытаетесь вишневый выбор
fd9f578, который был слиянием с двумя родителями. Поэтому вам нужно сказать команде cherry-pick, которая против какая разница должна быть рассчитана, используя . Например,git cherry-pick -m 1 fd9f578использовать родительский 1 в качестве базового.Я не могу точно сказать по вашей конкретной ситуации, но с помощью
git mergeвместоgit cherry-pickобычно рекомендуется. Когда вы вишневый выбор слияния фиксации, он рушится все изменения, внесенные в родитель, который вы не указали-mна совершил. Вы теряете всю их историю, и глом вместе все их различия. Ваш вызов.
@Borealid ответ правильный, но предположим, что вы не заботитесь о сохранении точной истории слияния ветви и просто хотите выбрать ее линеаризованную версию. Вот простой и безопасный способ сделать это:
начальное состояние: вы находитесь на филиал
X, и вы хотите вишни-выбрать коммитыY..Z.
git checkout -b tempZ Zgit rebase Ygit checkout -b newX Xgit cherry-pick Y..tempZ- (опционально)
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 заключается в том, чтобы взять разницу, которую представляет набор изменений (разница между рабочим деревом в этой точке и рабочим деревом его родителя), и применить набор изменений к вашей текущей ветви.
если фиксация имеет два или более родителей, как в случае со слиянием, эта фиксация также представляет два или более различий. Ошибка возникает из-за неопределенность в отношении того, какие различия должны применяться.
варианты
если вы определяете, что вам нужно включить слияние против вишневого выбора связанных коммитов, у вас есть два варианта:
(более сложный и неясный; также отбрасывает историю) вы можете указать, какой родитель должен применяться.
использовать
-mвозможность сделать это. Например,git cherry-pick -m 1 fd9f578будет использовать первый родитель, указанный в слиянии в качестве основа.также учтите, что когда вы выбираете фиксацию слияния, она рушится все изменения, внесенные в родитель, который вы не указали
-mна совершил. Вы теряете всю их историю, и глом вместе все их различия. Ваш звонок.(проще и привычнее; сохраняет историю) вы можете использовать
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