вишневый выбор - это слияние различий от родителя вашего вишневого выбора до вишневого выбора, с различиями от вашего родителя вишневого выбора до вашего проверенного наконечника. Вот и все. Git не должен знать больше. Ему все равно, где находятся какие-либо коммиты, ему нужно объединить эти два набора различий.
revert — это слияние различий от вашего возврата к его родителю с различиями от вашего возврата к проверенному совету. Вот и все. Git больше ничего знать не должен.
Вот: попробуйте это:
git init test; cd $_
printf %s\\n 1 2 3 4 5 >file; git add .; git commit -m1
sed -si 2s,$,x, file; git commit -am2
sed -si 4s,$,x, file; git commit -am3
Запустите git diff :/1 :/2
и git diff :/1 :/3
. Это различия, которые запускает git, когда вы говорите git cherry-pick :/2
здесь. Первый diff изменяет строку 2, а второй коммит изменяет строки 2 и 4; изменение строки 4 не упирается ни в какие изменения в первом diff, а изменение строки 2 идентично в обоих случаях. Делать нечего, все изменения :/1
-:/2
тоже в :/1
-:/3
.
Теперь, прежде чем вы начнете дальше, позвольте мне сказать следующее: это труднее объяснить прозой, чем просто увидеть. Выполните приведенную выше примерную последовательность и посмотрите на результат. намного, намного проще понять, что происходит, глядя на это, чем читая какое-либо описание. Каждый проходит через период, когда это слишком ново, и, возможно, небольшая ориентация поможет, и для этого и предназначены абзацы ниже, но опять же: проза сама по себе труднее понять, чем различия. Запустите diffs, попытайтесь понять, на что вы смотрите, если вам нужна небольшая помощь в том, что, как я обещаю, является очень небольшим горбом, следуйте тексту ниже. Когда он сфокусируется, посмотрите, не хлопнете ли вы хотя бы мысленно себя по лбу и не подумаете, почему это было так трудно увидеть?
Правила слияния Git довольно просты: идентичные изменения перекрывающихся или примыкающих строк принимаются как есть. Изменения строк без изменений в одном diff для измененных строк или строки, примыкающие к измененным строкам, в другом принимаются как есть. Разные изменения в любых перекрывающихся или примыкающих линиях, ну, есть очень много истории, на которую нужно смотреть, и никто никогда не находил правила, которое будет предсказывать, какие результаты должны быть каждый раз, поэтому git объявляет конфликт изменений, сбрасывает оба набора результатов в файл и позволяет вам решить, каким должен быть результат.
Итак, что произойдет, если вы теперь измените строку 3?
sed -si 3s,$,x, file; git commit -amx
запустите git diff :/1 :/2
и git diff :/1 :/x
, и вы увидите, что там, где по отношению к родителю вишенки :/2
изменилась строка 2, а ваша подсказка изменила строки 2, 3 и 4. 2 и 3 соприкасаются, это исторически слишком близко для автоматизированных джинов, чтобы справиться правильно, так что да, вы можете это сделать: git cherry-pick :/2
теперь объявит конфликт, показав вам изменение строки 2 и две разные версии строк 3 и 4 (:/2 не изменил ни того, ни другого, ваш совет изменил оба, в контексте здесь ясно, что изменения в строках 3 и 4 хороши как есть, но опять же: никто так и не придумал автоматическое правило для надежной идентификации таких контекстов).
Вы можете прозвонить изменения в этой настройке, чтобы проверить, как работает возврат. Также всплывающие окна и слияния, а также git checkout -m
, который запускает быстрое специальное слияние с вашим индексом.
Ваш git cherry-pick B^..C
— это выборка из двух коммитов, B
и C
. Он делает их один за другим, точно так же, как описано выше. Поскольку вы вернули B
и C
, а затем снова выбрали их, это имеет тот же эффект, что и применение B
и C
, а затем выбор вишни B
(с намерением затем выбрать вишни C
). Я пришел к выводу, что B
и C
касаются перекрывающихся или примыкающих строк, поэтому git diff B^ B
покажет изменения, которые перекрываются или примыкают к изменениям в git diff B^ C'
, и это то, что Git не собирается просто выбирать для вас, потому что все, что выглядит правильно здесь, в других обстоятельствах никто не может написать Правило идентификации, одинаково выглядящий выбор будет неправильным. Итак, git говорит, что два набора изменений конфликтуют, и вы должны разобраться.
person
jthill
schedule
24.01.2021