Как `git rebase master` проверяет повторное применение коммита как конфликта? - PullRequest
0 голосов
/ 12 октября 2018

Предположим, у нас есть два примера с его коммитами (line 1, line 2... - это содержимое файла foo, который является единственным файлом в рабочем каталоге):

Пример 1:

line 1     line 1
line 2     line 22
line 3     line 3
  C0---------C1 [master]
   \
    C2 [test]
  line 1
  line 222
  line 3

Пример 2:

line 1     line 1
line 2     line 22
line 3     line 3
  C0---------C1 [master]
   \
    C2--------C3 [test]
  line 1     line 1
  line 22    line 222
  line 3     line 3

Я запускал git checkout test и git rebase master в каждом из этих примеров, и я увидел, что в Примере 1 есть конфликт, а в Примере 2 его нет.

В Примере 1 при повторном применении C2 я предполагаю, что Git выполняет трехстороннее слияние на C2, C1 и C0, которое обнаруживает, что "line 222" на C2 отличается от "line 22" на C1 и отличается от "line 2" на базе (C0), так что Git проверит это как конфликт.

В Примере 2 патч C2 уже имеет в master Так что Git пропустить это.Но при повторном применении C3, если Git выполняет трехстороннее слияние на C3, C1 и C0, которые обнаруживают, что "line 222" на C3 отличается от "line 22" на C1 и отличается от"line 2" на базе (C0), тогда Git должен проверить это как конфликт, а в реальном Git этого не делает.

Итак, как в действительности перебазирование Git проверяет повторное применение коммита как конфликта?

1 Ответ

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

Каждый коммит копируется (или как бы) git cherry-pick.Вишневый пик - это слияние, база слияния которого является родителем выбранного коммита, при этом версия --ours является коммитом HEAD, а версия --theirs - выбранным коммитом.Итак, учитывая:

C0--C1   <-- master
 \
  C2--C3   <-- test

и:

git checkout test && git rebase master

Git сначала скопирует C2 в C2', затем скопирует C3 в C3'.

При копировании C2 база объединения составляет C0 (родительский элемент C2), --ours равен C1 (наконечник master), а --theirs равен C2 (копируется),После того, как копия закончена, у нас есть это:

       C2'  <-- HEAD
      /
C0--C1   <-- master
 \
  C2--C3   <-- test

Далее Git cherry-picks C3.Таким образом, база слияния составляет C2 (родительский элемент C3), --ours - C2', а --theirs - C3.

В случае разницы возникает конфликт слияния (* 1037)*) от базы к нашей, по сравнению с разницей от базы к их, затрагивает "те же строки" одного и того же файла.«То же» в этом случае включает в себя одну строку после строки, которой коснулись.Итак, сравните содержимое C2 (base) с каждым из C2' и C3, чтобы увидеть, какие строки изменились в нашей (C2 против C2') и их (C2 против C3),Если мы взяли «их» изменение в строку 2 при создании C2', разница от C2 до C2' пуста, и, следовательно, объединение тривиально разрешается путем взятия файла из C3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...