Перейти к содержимому

стратегии слияния

конфликты слияния

Стратегии слияния в Git

Когда работа завершена и готова к слиянию с основной веткой разработки, следует выбрать стратегию слияния.

Git объединяет изменения из разных веток с помощью различных методов, известных как «стратегии слияния». После выбора стратегии Git создает новый коммит слияния, объединяющий изменения указанных веток. Если не указано иное, команда git merge автоматически выберет стратегию на основе предоставленных веток. Для указания имени стратегии можно использовать опцию -s. Ниже приведен список стратегий слияния:

Recursive

Стратегия слияния recursive

bash
git merge -s recursive branch_name

Git выбирает recursive в качестве стратегии по умолчанию при извлечении или слиянии веток. Эта стратегия может обнаруживать и обрабатывать слияния, включающие переименования, но не может использовать обнаруженные копии.

Resolve

Стратегия слияния resolve

bash
git merge -s resolve branch_name

Стратегия resolve использует трехстороннее слияние для разрешения веток и может обрабатывать только два HEAD с помощью алгоритма трехстороннего слияния. Она безопасна, быстра и детально обнаруживает неоднозначности перекрестного слияния.

Octopus

Стратегия слияния octopus

bash
git merge -s octopus branch1 branch2 branch3

При передаче нескольких веток в команду слияния стратегию octopus можно использовать для объединения их в один коммит. Octopus откажется от слияния, если возникнут конфликты, требующие ручного разрешения. Основное применение Octopus — группировка HEAD веток с общими чертами.

Ours

Стратегия слияния ours

bash
git merge -s ours branch_name

Стратегия ours разрешает слияние нескольких веток, но результат всегда соответствует HEAD текущей ветки. Она эффективно игнорирует все изменения из других веток. Предназначена для замены старой истории боковых веток.

Subtree

Стратегия слияния subtree

bash
git merge -s subtree branch_name

Стратегия subtree является модифицированной версией стратегии recursive. Например, мы объединяем деревья A и B. При сопоставлении с поддеревом A, дерево B сначала изменяется, чтобы отразить структуру дерева A. Изменение может быть применено к общему предку деревьев A и B.

Типы стратегий слияния в Git

Коммиты слияния (явные)

Явные слияния считаются типом слияния по умолчанию. Они называются явными, потому что создают новый коммит слияния, изменяя историю и показывая место вызова слияния. Содержание коммита слияния также считается явным, так как отображает родительские коммиты.

Быстрое продвижение (неявные)

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

Слияние с объединением (Squash)

Squash — это опция слияния, которая позволяет избежать создания коммита слияния. При таком слиянии все коммиты из исходной ветки объединяются в один новый коммит, который затем применяется к целевой ветке. Обычно это выполняется с помощью флага --squash во время слияния или интерактивного ребейза. История коммитов исходной ветки превращается в один объединенный коммит в целевой ветке.

Опции стратегии слияния recursive в Git

oursПринудительно разрешает конфликтующие части, отдавая предпочтение «нашей» версии. Изменения из другого дерева, не конфликтующие с нашей стороной, отражаются в результате слияния.
theirsОтдает предпочтение другому дереву при разрешении конфликтов. Стратегии слияния "theirs" не существует, в отличие от "ours".
patienceТратит больше времени, чтобы избежать ошибочных слияний, возникающих из-за незначительных совпадающих строк.
diff-algorithmЗаставляет "merge-recursive" использовать другой алгоритм diff, который помогает избежать ошибочных слияний на незначительных совпадающих строках.
ignore-space-change / ignore-all-spaceОтносится к символам пробелов. Изменения пробелов, смешанные с другими изменениями, не игнорируются.
renormalizeВыполняет checkout и check-in для всех этапов файла при разрешении трехстороннего слияния.
no-normalizeОтключает опцию renormalize.
no-renamesИгнорирует переименованные файлы во время слияния.
find-renames=nВключает обнаружение переименований с порогом сходства. Порог по умолчанию составляет 50%.
subtreeРаботает с метаданными путей дерева, чтобы привести деревья к соответствию.

Practice

Какие существуют различные стратегии слияния в Git и каковы их характеристики?

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.