Вишневый сбор коммит включает в себя предыдущие коммиты? - PullRequest
0 голосов
/ 06 мая 2018

После финиша https://learngitbranching.js.org, Мне показалось, что мне пришла в голову идея выбора вишни, но оказалось, что я вообще этого не сделал.

Я создал файл abc.txt и сделал коммиты, как показано ниже:

(write a) ← (write b) ← (write c)[master][HEAD]

, которым abc.txt стало:

a
b
c

Теперь создаем ветку from-a на (write a):

(write a)[from-a][HEAD] ← (write b) ← (write c)[master]

и сбор вишни (write c)[master], я думал, что abc.txt будет содержать только a-line и c-line, т.е. как

a
c

но на самом деле это выглядело как:

a
<<<<<<< HEAD
=======
b
c
>>>>>>> 3a0882d... write c

Здесь моя путаница состоит из двух частей. Почему это противоречит, а не просто добавление строки (ей)? Почему он содержит b-линию, хотя я выбрал только вишню write c?

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

вишня - это слияние.

commit c отличается от c s base commit, добавляет строку c.

commit a также отличается от базового коммита c, он удаляет строку b.

                          file  [b]
                          ----
                          a
                          b


   file [a]                                  file [c]
   ----                                      ----
   a                                         a
                                             b
                                             c

Поскольку два блока изменений перекрываются, Git предполагает, что затронутые строки могут быть связаны, поскольку семантические объекты в исходном коде часто занимают несколько строк, которые вы могли бы добавить к объекту в одном изменении и удалить весь объект в другом, строка c может как-то быть связано со строкой b, и если вы удаляете b, вы можете не захотеть добавлять c.

0 голосов
/ 06 мая 2018

Git учитывает контекст и ищет окружающие строки, а также те, которые были добавлены / удалены.

Это имеет смысл, потому что git нужно знать, где следует применить изменение от коммита.

В вашем случае ветка from-a имеет содержание

 a

Окружающие линии пусты.

У коммита, который вы пытаетесь выбрать cherry, есть такое содержание:

diff --git a/abc.txt b/abc.txt
index 422c2b7..de98044 100644
--- a/abc.txt
+++ b/abc.txt
@@ -1,2 +1,3 @@
 a
 b
+c

Даже если сообщение о коммите показывает более широкий контекст вокруг добавленных / удаленных строк, git будет пытаться соответствовать только одной строке выше и одной строке ниже модификации. (Спасибо дас-г )

Это означает, что git попытается найти строку:

b

в конце файла и вставить строку

c

после него.

Так как в вашей ветке from-a (текущий HEAD), git не может найти строку

b

в конце файла и поэтому не может корректно применить ваш патч, что привело к конфликту.

текст

<<<<<<< HEAD
=======
b
c
>>>>>>> 3a0882d... write c

представляет конфликт, при котором git видит, что фактическое содержимое в конце файла - ничто, обозначенное

<<<<<<< HEAD
=======

но git ожидал найти строку

b

для добавления строки

c

после него, обозначенное

=======
b
c
>>>>>>> 3a0882d... write c

Вам остается разрешить конфликт и решить, как присоединиться к этим двум государствам.

При возникновении конфликтов всегда ищите код между парами из <<<<<<< HEAD и >>>>>>>.
Между ними у вас будет =======, который отделяет состояние от текущего HEAD и состояние, ожидаемое после применения патча.

...