В чем разница между объединением мастера в ветку и объединением ветки в мастер?
У меня есть ветка под названием master
а другой называется dev
, Обычно я делаю тесты и улучшения dev
и когда решил, что все в порядке, я объединяю его в master
Затем пометить и выпустить новую версию приложения. Я встретил два случая слияния:
- сливаться
master
вdev
, а также - сливаться
dev
вmaster
,
но я не совсем уверен, чем они отличаются... Любое объяснение будет приветствоваться.
2 ответа
TL;DR
Основное различие заключается в том, где master
а также dev
ветви в конечном итоге указывают.
Полное объяснение
Слияние одной ветви в другую не является симметричной операцией:
- объединение
dev
вmaster
, а также - объединение
master
вdev
,
как правило, не эквивалентны. Вот иллюстративный пример, который объясняет разницу между ними. Давайте предположим, что ваш репо выглядит следующим образом:
Если вы объедините dev
в master
Если master
проверено (git checkout master
),
и тогда ты сливаешься dev
(git merge dev
), вы окажетесь в следующей ситуации:
master
ветвь теперь указывает на новый коммит слияния (F
), в то время как dev
по-прежнему указывает на тот же коммит (E
) как это было до слияния.
Если вы объедините master
в dev
Если, с другой стороны, dev
проверено (git checkout dev
),
и тогда ты сливаешься master
(git merge master
), вы окажетесь в следующей ситуации:
dev
ветвь теперь указывает на новый коммит слияния (F'
, в то время как master
по-прежнему указывает на тот же коммит, что и до слияния (D
).
Собираем все вместе
Лично я не думаю, что принятого ответа достаточно для неспециалиста (и если вы искали этот ответ, вы непрофессионал Git!!).
@jub0bs правильно описывает техническую разницу между ними. Но в его ответе нет указания на то, что вы «должны» использовать или почему.
Конечно, всегда будут исключения, но в общем случае вы (гм) всегда захотите объединить DEV в MASTER (сценарий b в ответе jub0bs).
Почему?
Чтобы понять почему , вам нужно копнуть немного глубже, чем высокоуровневый график временной шкалы, на котором jub0bs ведет разговор. Потому что в конце обоих коммитов, когда вы смотрите в каталог вашей ОС, вы не сможете увидеть разницу. Поэтому наивный разработчик скажет вам, что не имеет значения, в какую сторону вы объединяете коммиты.
Чтобы увидеть разницу, вам нужно взглянуть на инструменты сравнения (которые, надеюсь, должны быть встроены в ваш git-клиент (будь то SmartGit, GitKraken или что-то еще).
Представим этот файл на ветке MASTER:
filename: my_code.txt
some (code) { includes := feature1 + feature2 + feature3; }
И в ветке DEV у нас есть исправление, которое было включено:
filename: my_code.txt
some (code) { includes := feature1 + feature2 + bug-fix; }
После коммита слияния (независимо от того, каким образом вы это делаете) у вас будет:
filename: my_code.txt
some (code) { includes := feature1 + feature2 + bug-fix + feature3; }
Вы увидите разницу только в своем Git-клиенте.
Если вы объедините MASTER с DEV (согласно сценарию c), ваш Git-клиент сообщит вам, что он всегда был там как часть основной истории файла, и что в какой-то момент кто-то пришел, чтобы вклиниться (почти как после -мысль). Но любой полупорядочный кодер скажет вам, что логически это неверная интерпретация истории!
Что вы действительно хотите сделать, так это объединить DEV с MASTER. В этом случае история подскажет вам, что