Почему в текущей ветке 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.