Типы слияний

Продвинутый Git

Amanda Crawford-Adamo

Software and Data Engineer

Меня зовут Аманда

Фотография Аманды

Продвинутый Git

Что такое git merge?

Команда Git Merge:

git merge
  • Объединяет изменения из одной ветки в другую
  • Находит общую базу между двумя ветками
  • Поддерживает различные стратегии слияния

Дорога, где два пути сходятся в один, и две машины едут по общей полосе

Продвинутый Git

Слияние перемоткой вперёд

Что такое слияние перемоткой вперёд?

  • Сохраняет простую линейную историю
  • Подходит для краткосрочных веток с небольшими изменениями

$$

Когда не стоит применять

  • Когда нужно сохранить историю ветки
  • При сложной разработке в долгосрочных ветках
  • При конфликте слияния — перемотка вперёд сразу завершится ошибкой!
Продвинутый Git

Слияние перемоткой вперёд (до)

График двух веток: main и feature. В main два коммита. Ветка feature ответвляется после последнего коммита main и содержит один дополнительный коммит.

Продвинутый Git

Синтаксис слияния перемоткой вперёд

Слияние перемоткой вперёд по умолчанию

git checkout main
git merge feature_branch

Принудительное слияние перемоткой вперёд

git merge <branch> --ff-only

Пример

git checkout main
git merge feature_branch --ff-only
Продвинутый Git

Слияние перемоткой вперёд (после)

График двух веток: main и feature. В main три коммита. Ветка feature ответвляется после второго коммита main и содержит один дополнительный коммит. Третий коммит main является копией последнего коммита ветки feature.

Продвинутый Git

Рекурсивное слияние

Что такое рекурсивное слияние?

  • Создаёт коммит слияния с двумя родителями
  • Сохраняет полную историю проекта
  • Подходит для долгосрочных веток
  • Сохраняет структуру ветвления

$$

Когда не стоит применять

  • Когда нужна простая линейная история
  • Для быстрых и незначительных изменений
Продвинутый Git

Рекурсивное слияние (до)

График двух веток: main и feature. В main три коммита. Ветка feature ответвляется после первого коммита main и содержит два дополнительных коммита.

Продвинутый Git

Синтаксис рекурсивного слияния

Команда рекурсивного слияния:

git merge --no-ff <branch>

Пример

$ git checkout main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.

$ git merge --no-ff feature_branch
Merge made by the 'recursive' strategy.
...
Продвинутый Git

Рекурсивное слияние (после)

График двух веток: main и feature. В main шесть коммитов. Ветка feature ответвляется после последнего коммита main и содержит два дополнительных коммита. Шесть коммитов main представляют собой чередование коммитов обеих веток. Последний коммит main — это коммит слияния с двумя родителями: последним коммитом feature и предыдущим последним коммитом main.

Продвинутый Git

Итоги

  • Слияние перемоткой вперёд сохраняет простую линейную историю
  • Рекурсивное слияние сохраняет полный исторический контекст
  • Рекурсивное слияние лучше подходит для сложной разработки

Команды слияния перемоткой вперёд

git merge <branch_name> # команда по умолчанию
git merge --ff-only <branch_name> # принудительное слияние перемоткой вперёд

Команда рекурсивного слияния

git merge --no-ff <branch_name>
Продвинутый Git

Давайте потренируемся!

Продвинутый Git

Preparing Video For Download...