Почему в текущей ветке git cherry-pick override не изменяется, если они разные?

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

Первоначально обе ветви A и B имеют полную копию одного и того же файла.

begin
 123
 456
 def f
 789
 klm
end

Но они расходятся. Во-первых, А движетсяdef f в конец файла, производя переработанный А

begin
 123
 456
 789
 klm
end
def f

Теперь, если мы выберем B поверх этого A, исходный файл будет восстановлен (def f вернулся в середине файла). Это нормально, потому что я заявил, что должен задать этот вопрос, как только мне сообщили, чтовишня с-theirs производит первостепенную альтернативу вишни, B - это «их» версия файла, и это то, что я ожидал, потому что мы видим, что B действительно выигрывает: единственная разница между A и B заключается в месте A-рефакторинга, и B-версия предпочтительна в этом случае.

Однако я начал задавать этот вопрос, потому что это не всегда так. Если мы добавим немного изменений в B, например, переписать первую строку процедуры, например, 123222 (Я маркирую эту новую версию BC в коде bash ниже), как вы думаете, что будет результатом выбора этого C в A? Результат выбора A <- C вызывает недоумение

begin
 222
 456
 789
 klm
end
def f

Видите ли, первая строка 222 от C, ноdef f также в конце, что означает, что рефакторинг A сохранился, и C не переопределил его. Это загадка противоречивого поведения ИМО. Вы думаете, что B отличается от A на весь файл, но это не так, если вы немного измените его. Несвязанные изменения останавливают откат, или я просто не могу разобраться с правилами git. Какие изменения я должен ожидать в вишневом пике?

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

Вы можете восстановить ситуацию, используя

mkdir preserving ; cd preserving
git init ; echo rrr > root
git add root ; git commit -m root

git checkout -b B ; git checkout -b A

function makeABC {
    echo begin > abc
    echo " 123" >> abc
    echo " 456" >> abc
    echo " def f" >> abc
    echo " 789" >> abc
    echo " klm" >> abc
    echo end >> abc
}

echo commiting ABC into branch A
makeABC ; git add abc ; git commit -m abc

echo refactoring A, def f moved into the end of file
git checkout A
sed -i -e '/def f/d' abc
echo "def f" >> abc
git add abc ; git commit -m "refactoring 'def f'"

echo posting abc into B
git checkout B ; makeABC ; git add abc ; git commit -m "abc in B"

echo choosing which branch to pick
picking="B" ; case $picking in
    "B") ;;
    "C") git checkout -b C ; sed -i -e 's/123/CCC/g' abc
        git add abc ; git commit -m CCC ;;
esac

git checkout A ; git cherry-pick $picking -Xtheirs 

echo observe if refactoring def f is in place in A
gitk --all & 

echo 'preserving' folder created

Установить значениеpicking Переменная на «B» или «C», чтобы выбрать ветку, которую вы хотите выбрать на A.

Ответы на вопрос(2)

Ваш ответ на вопрос