Когда вы будете использовать разные стратегии слияния git?

На странице man на git -merge существует ряд стратегий слияния, которые вы можете использовать.

  • разрешить - Это может разрешить только две головки (т.е. Текущую ветку и другую ветвь, из которой вы вытащили), используя трехсторонний алгоритм слияния. Он пытается тщательно определить неоднозначность скрещивания слияния и считается в целом безопасным и быстрым.

  • рекурсивный - Это может разрешить только две головы, используя алгоритм трехмерного слияния. Когда существует более чем один общий предки, которые можно использовать для слияния с тремя путями, он создает объединенное дерево общих предков и использует это как дерево ссылок для слияния с тремя путями. Сообщается, что это привело к меньшему количеству конфликтов слияния, не вызывая ошибочных слияний тестов, выполненных при фактических коммандах слияния, взятых из истории развития ядра Linux 2.6. Кроме того, это может обнаруживать и обрабатывать слияния с использованием переименований. Это стратегия слияния по умолчанию при вытягивании или объединении одной ветки.

  • осьминог - Это решает проблему с двумя головками, но отказывается выполнять сложное слияние, требующее ручного разрешения. Он предназначен, прежде всего, для объединения головок ветвей темы. Это стратегия слияния по умолчанию при вытягивании или объединении нескольких ветвей.

  • ours - Это разрешает любое количество головок, но результатом слияния всегда является текущая ветвь. Он предназначен для замены старой истории развития боковых ветвей.

  • поддерево - Это модифицированная рекурсивная стратегия. При объединении деревьев A и B, если B соответствует поддереву A, B сначала корректируется, чтобы соответствовать древовидной структуре A, вместо того, чтобы читать деревья на одном уровне. Эта настройка также выполняется для общего дерева предков.

Когда мне нужно указать что-то другое, чем значение по умолчанию? Какие сценарии лучше всего подходят?

Ответ 1

Я не знаком с решением, но я использовал другие:

Рекурсивный

Рекурсивный по умолчанию используется для непереходных слияний. Мы все знакомы с этим.

Octopus

Я использовал осьминог, когда у меня было несколько деревьев, которые нужно было объединить. Вы видите это в более крупных проектах, где у многих отраслей есть независимое развитие, и все они готовы собраться в единую голову.

Ось осьминога объединяет несколько головок в одном компе, пока он может сделать это чисто.

Для иллюстрации представьте, что у вас есть проект с мастером, а затем три ветки для слияния (назовите их a, b и c).

Ряд рекурсивных слияний будет выглядеть так (обратите внимание, что первое слияние было быстрым, так как я не заставлял рекурсию):

серия рекурсивных слияний

Однако одно слияние осьминога будет выглядеть так:

commit ae632e99ba0ccd0e9e06d09e8647659220d043b9
Merge: f51262e... c9ce629... aa0f25d...

octopus merge

Наши

Ours == Я хочу забрать другую голову, но отбрось все изменения, которые вводит глава.

Это сохраняет историю ветки без каких-либо эффектов ветки.

(Читайте: он даже не смотрит на изменения между этими ветвями. Разветвления просто сливаются, и ничего не делается с файлами. Если вы хотите объединиться в другую ветку, и каждый раз возникает вопрос "наш файл версии или их версии" вы можете использовать git merge -X ours)

Subtree

Subtree полезен, если вы хотите объединить в другой проект в подкаталог вашего текущего проекта. Полезно, когда у вас есть библиотека, которую вы не хотите включать в качестве подмодуля.

Ответ 2

Собственно, только две стратегии, которые вы хотели бы выбрать, - это наш, если вы хотите отказаться от изменений, внесенных веткой, но сохраните ветку в истории и поддерево, если вы объединяют независимый проект в подкаталог суперпроекта (например, 'git -gui' в репозитории 'git').

octopus merge используется автоматически при слиянии более двух ветвей. Решение здесь происходит главным образом по историческим причинам, а также когда вы попадаете в рекурсивные ситуации с треугольной стратегией слияния.

Ответ 3

Стратегия слияния "Resolve" и "Recursive"

Рекурсивная текущая стратегия с двумя головами по умолчанию, но после некоторого поиска я наконец нашел некоторую информацию о стратегии слияния "решить".

Взято из книги О'Рейли Управление версиями с помощью Git (Amazon) (перефразировано):

Первоначально, "разрешение" было стратегией по умолчанию для слияний Git.

В ситуациях перекрестного слияния, когда существует более одной возможной базы слияния, стратегия разрешения работает следующим образом: выберите одну из возможных баз слияния и надейтесь на лучшее. Это на самом деле не так плохо, как кажется. Часто оказывается, что пользователи работают над разными частями кода. В этом случае Git обнаруживает, что он повторно объединяет некоторые уже внесенные изменения, и пропускает повторяющиеся изменения, избегая конфликта. Или, если это небольшие изменения, которые приводят к конфликту, по крайней мере, конфликт должен быть легким для разработчика.

Я успешно объединил деревья, используя "resolv", который не удался с рекурсивной стратегией по умолчанию. Я получал ошибки fatal: git write-tree failed to write a tree, и благодаря этому сообщению в блоге (mirror) я попытался "-s resolve", что сработало. Я до сих пор не совсем уверен, почему... но я думаю, что это потому, что у меня были дублирующие изменения в обоих деревьях, и я решил "пропустить" их должным образом.

Ответ 4

Поскольку ответы выше не показывают все детали стратегии. Например, в некоторых ответах отсутствуют детали об опции импорта resolve и о recursive, который имеет много подопций, таких как ours, theirs, patience, renormalize и т.д.

Поэтому я бы рекомендовал посетить официальную документацию git, которая объясняет все возможные функции:

https://git-scm.com/docs/merge-strategies