что делает git cherry-pick {commit-hash}? - PullRequest
0 голосов
/ 22 октября 2018

Учитывая, что у меня есть 3 коммита в порядке

c1
+ print("A")

c2
+ print("B")

c3
+ print("C")

, тогда я проверяю новую ветку на c1.

git checkout -b br c1

, затем я выбираю вишню с3.

git cherry-pick c3.

я хочу, чтобы файл имел

print("A")
print("C") 

- я просто выбираю c3 и c3, просто добавляю строку print ("C")

но факт в том, что я получил конфликты и в результате

print("A")
++<<<<<<< HEAD
++=======
+ print("B")
+ print("C")
++>>>>>>> f1383aa... C

мой вопрос: 1. почему конфликты?2. что мне делать, если я хочу распечатать ("A") и напечатать ("C")?

Я также пытался даже я

git diff C^1 .. C > 1.patch
git apply 1.patch

Я получил

zhifan@zhifandeMacBook-Pro ~/g/demo> git apply 1.patch
error: patch failed: 1.py:1
error: 1.py: patch does not apply

1 Ответ

0 голосов
/ 22 октября 2018

Сбор вишни - это, по сути, копирование (эффектов) коммита.Вы можете думать об этом так, как вы это представляете, то есть, когда 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?

...