Как git автоматически объединяет две ветви? - PullRequest
4 голосов
/ 13 июня 2019

Мой вопрос основан на примере: https://git -scm.com / book / en / v2 / Git-Branching-Basic-Branching-and-Merging

enter image description here

Взял пример:

  1. Установить переменную = 2 в Commit C2, затем изменить на переменную = 4 в C4 и вернуться к переменной = 2 в C5
  2. Сделать git merge master <branch of iss53>, в результате Merge made by the 'recursive' strategy.
  3. Переменная 4.

Но почему?

Я ожидал: поскольку предок устанавливает переменную = 2, а фиксация (iss53) также устанавливает переменную = 2, результат после слияния должен быть равен 2. Поскольку общий предок и самая новая версия установили переменную = 2

Это поведение зависит от стратегии слияния?

edit : Я забыл упомянуть, что я изменил переменную = 3 в C3. Но результат тот же.

Ответы [ 2 ]

5 голосов
/ 13 июня 2019

Я не знаю, являются ли перечисленные вами шаги дословно тем, что произошло на самом деле, но если это так, то в коммите C3 переменная по-прежнему имеет значение 2, и фактически значение переменной не изменяется с момента коммита C2в ветке iss53.Затем вы объединили master в iss53.Это принесло то, что Git воспринял как изменение, происходящее из ветви функций, это изменение состояло в том, что переменная теперь имеет значение 4. Git сохранил версию, исходящую из master, и это поведение, которое я обычно ожидаю от Git auto.алгоритм слияния.

В случае, если обе ветви изменили значение переменной, возникнет конфликт слияния.Например, если в коммите C3 переменная была изменена на 5, то Git не знал бы, чья версия истины по умолчанию установлена, и поэтому он не будет автоматически объединяться, вместо этого помечая эту строку как конфликт объединения.

1 голос
/ 13 июня 2019

Вопрос не в том, какая редакция хронологически новее. Это вопрос содержания веток, которые вы объединяете, и содержания общего предка.

C2 говорит 2, C5 говорит 2 (поэтому нет изменений по сравнению с C2), C4 говорит 4 (есть изменение), поэтому git будет сохранять его равным 4 после слияния.

У вас могут быть причудливые сценарии, такие как установка значения 6 на C3, затем 2 на C5 ..... в этом случае снова без изменений от C2, поэтому конечный результат будет 4, потому что между C2 и C5 нет изменений (хотя в середине произошли изменения).

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