Складні сценарії злиття

Просунуте Git

Amanda Crawford-Adamo

Software and Data Engineer

Репозиторій конвеєра даних про перельоти

Граф сховища конвеєра обробки даних про перельоти: у робочому каталозі git 4 файли — etl.py, load.py, transform.py та ingest.py. У каталозі data є папка з flight_data.csv. Також показано теку .git.

Просунуте Git

Git squash merge

$$

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

  • Створює один новий коміт у цільовій гілці
  • Об'єднує всі зміни з вихідної гілки
    • Додає звичайний коміт з одним батьком (на відміну від recursive)
  • Додається до цільової гілки (не до feature-гілки)
    • Не зберігає детальну історію комітів вихідної гілки

$$

Переваги

  • Чиста лінійна історія
  • Спрощує код-рев'ю для великих фіч
  • Легше відкотити всю фічу
Просунуте 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

Git octopus merge

$$

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

  • Об'єднує три й більше гілок одночасно
  • Створює один merge-коміт з кількома батьками
  • Найкраще, коли між гілками немає конфліктів

$$

Переваги

  • Корисно для одночасної інтеграції кількох незалежних фіч
  • Використовується для синхронізації кількох релізних гілок різних версій проєкту
Просунуте 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. Вони відгалужуються від main після першого коміту, у кожній є додатковий коміт. Main має п'ять комітів і включає коміти інших гілок. Останній merge-коміт має чотири батьки: попередній останній коміт main та останні коміти ingest, transform і load.

Просунуте Git

Підсумок

Squash merge

  • Спрощує історію, об'єднує кілька комітів в один
  • Використовуйте squash для чистої, стислої історії
    git merge --squash <source_branch>
    

Octopus merge

  • Зберігає структуру гілок
  • Об'єднує кілька гілок одночасно
  • Ефективно інтегрує паралельні розробки
    git merge -s octopus <branch 1> <branch 2> <branch 3>
    
Просунуте Git

Давайте потренуємось!

Просунуте Git

Preparing Video For Download...