Сложные сценарии слияния

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

Amanda Crawford-Adamo

Software and Data Engineer

Репозиторий конвейера данных о рейсах

График структуры репозитория конвейера данных о рейсах. Рабочий каталог git содержит 4 файла: etl.py, load.py, transform.py и ingest.py. В каталоге data находится папка flight_data.csv. Также показана папка git.

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

Слияние squash в Git

$$

Функциональность

  • Создаёт один новый коммит в целевой ветке
  • Объединяет все изменения из исходной ветки
    • Добавляет обычный коммит с одним родителем (в отличие от рекурсивной стратегии)
  • Добавляется в целевую ветку (не в ветку функциональности)
    • Не сохраняет подробную историю коммитов исходной ветки

$$

Преимущества

  • Чистая и линейная история
  • Упрощает ревью кода для больших функциональностей
  • Упрощает откат всей функциональности
Продвинутый Git

Пример слияния squash

Ветка data-cleanup отходит от ветки main после второго коммита. Ветка main содержит один дополнительный коммит. Ветка data-cleanup содержит два дополнительных коммита.

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

Процесс слияния squash

  1. Переключитесь на ветку main

    $ git checkout main
    
  2. Создайте squash-коммит из всех изменений data-cleanup

    $ git merge --squash data-cleanup
    
  3. Зафиксируйте squash-коммит в истории ветки main

    $ git commit -m "Implement and optimize data cleanup"
    
Продвинутый Git

Результат слияния squash

График двух веток: main и data-cleanup. Ветка main содержит четыре коммита. Ветка функциональности отходит от последнего коммита main и содержит один дополнительный коммит. Последний коммит main — объект с одним родителем, содержащий объединённые коммиты ветки data-cleanup.

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

Слияние octopus в Git

$$

Функциональность

  • Объединяет три и более веток одновременно
  • Создаёт один коммит слияния с несколькими родителями
  • Лучше всего подходит, когда ветки не конфликтуют друг с другом

$$

Преимущества

  • Удобен для одновременного внедрения нескольких независимых функциональностей
  • Используется для синхронизации нескольких веток релизов разных версий проекта
Продвинутый Git

Пример слияния octopus

Схема четырёх веток разработки: main, ingestion, transform и load. Ветки ingestion, transform и load отходят от main после первого коммита, каждая с одним дополнительным коммитом. Ветка main также содержит один дополнительный коммит.

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

Команды слияния octopus

Команда Git Octopus Merge

git merge -s octopus

Пример

$ git merge -s octopus ingest transform load
Trying simple merge with ingest
Trying simple merge with transform
Trying simple merge with load
Merge made by the 'octopus' strategy.
...
Продвинутый Git

Результат слияния octopus

Схема четырёх веток разработки: main, ingestion, transform и load. Ветки ingestion, transform и load отходят от main после первого коммита, каждая с одним дополнительным коммитом. Ветка main содержит пять коммитов, включая коммиты остальных веток. Последний коммит слияния имеет четырёх родителей: предыдущий последний коммит main и последние коммиты веток ingest, transform и load.

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

Итоги

Squash merge

  • Упрощает историю, объединяя несколько коммитов в один
  • Используйте squash merge для чистой и линейной истории
    git merge --squash <source_branch>
    

Octopus merge

  • Сохраняет структуру веток
  • Объединяет несколько веток одновременно
  • Эффективно интегрирует несколько параллельных разработок
    git merge -s octopus <branch 1> <branch 2> <branch 3>
    
Продвинутый Git

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

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

Preparing Video For Download...