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

Стратегии слияния в Git
Когда работа завершена и готова к слиянию с основной веткой разработки, следует выбрать стратегию слияния.
Git объединяет изменения из разных веток с помощью различных методов, известных как «стратегии слияния». После выбора стратегии Git создает новый коммит слияния, объединяющий изменения указанных веток. Если не указано иное, команда git merge автоматически выберет стратегию на основе предоставленных веток. Для указания имени стратегии можно использовать опцию -s. Ниже приведен список стратегий слияния:
Recursive
Стратегия слияния recursive
git merge -s recursive branch_nameGit выбирает recursive в качестве стратегии по умолчанию при извлечении или слиянии веток. Эта стратегия может обнаруживать и обрабатывать слияния, включающие переименования, но не может использовать обнаруженные копии.
Resolve
Стратегия слияния resolve
git merge -s resolve branch_nameСтратегия resolve использует трехстороннее слияние для разрешения веток и может обрабатывать только два HEAD с помощью алгоритма трехстороннего слияния. Она безопасна, быстра и детально обнаруживает неоднозначности перекрестного слияния.
Octopus
Стратегия слияния octopus
git merge -s octopus branch1 branch2 branch3При передаче нескольких веток в команду слияния стратегию octopus можно использовать для объединения их в один коммит. Octopus откажется от слияния, если возникнут конфликты, требующие ручного разрешения. Основное применение Octopus — группировка HEAD веток с общими чертами.
Ours
Стратегия слияния ours
git merge -s ours branch_nameСтратегия ours разрешает слияние нескольких веток, но результат всегда соответствует HEAD текущей ветки. Она эффективно игнорирует все изменения из других веток. Предназначена для замены старой истории боковых веток.
Subtree
Стратегия слияния subtree
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 и каковы их характеристики?