В чем разница между объединением мастера в ветку и объединением ветки в мастер?

У меня есть ветка под названием master а другой называется dev, Обычно я делаю тесты и улучшения devи когда решил, что все в порядке, я объединяю его в masterЗатем пометить и выпустить новую версию приложения. Я встретил два случая слияния:

  1. сливаться master в dev, а также
  2. сливаться 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. В этом случае история подскажет вам, что , а также всегда были в рамках и планировались как основной ствол разработки всего проекта. с другой стороны, было добавлено только как необходимая коррекция (запоздалая мысль или отвлечение внимания) по ходу дела.

Другие вопросы по тегам