Сбор вишни - это, по сути, копирование (эффектов) коммита.Вы можете думать об этом так, как вы это представляете, то есть, когда diff определяет коммит, который будет выбран, и его родителя, то примените этот diff к текущему коммиту .Тем не менее, он более мощный, чем просто diff-and-apply, потому что у него есть доступ к полному механизму слияния Git .
Что это означает, что git cherry-pick
на самом деле полностью взорван git merge
внутренне, с объединением двух коммитов, являющихся вашим текущим коммитом - вашим HEAD
- и коммитом, который вы выбираете вишней. база слияния для этой операции является родителем коммита, который вы выбираете вишней.
Причина, по которой вы делаете это, заключается в том, что, как вы видели, вы можете получить конфликт слияния , если и ваш HEAD
коммит, и коммит, который вы выбираете вишней, изменили "одинаковые" строки.В этом случае ваш HEAD
коммит добавил строку print("A")
, возможно, в конце файла, но в любом случае прямо перед какой-то другой строкой.Между тем, коммит, который вы указываете Git для cherry-pick - commit c3, добавляет строку print("C")
в том же месте (в конце файла или перед той же существующей строкой).Git не знает, где разместить добавленные print
, поэтому он объявляет конфликт и заставляет you выбрать правильный ответ.
Решение достаточно простое: откройте конфликтующий файл в своемотредактируйте и настройте его так, чтобы он содержал правильное разрешение конфликта, затем запишите это и используйте git add
в файле, чтобы вы могли запустить git cherry-pick --continue
, чтобы завершить процесс выбора вишни.Или, если хотите, воспользуйтесь инструментом слияния, чтобы получить все три входных файла (базовый, «наш» или HEAD
и «их» или версия c3) и разрешить конфликт таким способом.
Для получения дополнительной информациио вишневом пике см. Что означает вишневый сбор комита с git?