Sobes.tech
Middle

Какви са разликите между подходите Trunk-Based Development и Feature Branching?

sobes.tech AI

Отговор от AI

Критерий Trunk-Based Development (TBD) Feature Branching (FB)
Основно ветвене Една главна ветка (trunk/main/master) Няколко дългосрочни ветки (develop, release, master)
Честота на сливане Много често (най-малко веднъж на ден) Рядко (след завършване на функцията)
Размер на функциите Много краткотрайни (от няколко минути до часове) Дълготрайни (от дни до седмици)
Интеграция Непрекъсната интеграция (CI) е ключова Интеграцията е по-рядка, може да е по-сложна
Риск от конфликти По-малко големи конфликти, но повече дребни, чести Повече големи конфликти при сливане на големи ветки
Време за пускане Бързо и често пускане (continuous delivery) По-бавно и по-рядко пускане
Изисквания към тестовете Високо ниво на автоматизирано тестване Тестовете могат да се изпълняват по-късно в цикъла
Размер на екипа Подходящо за малки и средни екипи, но мащабируемо с дисциплина Подходящо за големи екипи

Trunk-Based Development:

  • Фокус върху честа интеграция на малки промени директно в основната ветка.
  • Изисква строга дисциплина, автоматизирани тестове и флагове за функции за управление на незавършени функции.
  • Намалява рисковете, свързани с големи сливания.

Feature Branching:

  • Всяка функция се разработва в отделна ветка.
  • Сливането се извършва само след завършване на функцията.
  • Може да доведе до "задушаване" на промени и сложни конфликти при сливане, ако ветвите живеят дълго.

Примерен код за TBD (опростено):

// Разработката се води директно в main/trunk
public class FeatureA {
    public void doStuff() {
        // Код на функция А
    }
}

// Друг разработчик комитва почти едновременно в main/trunk
public class FeatureB {
    public void doOtherStuff() {
        // Код на функция B
    }
}

Примерен код за FB (опростено):

// Разработчик 1 работи в ветката feature/A
// git checkout -b feature/A develop
public class FeatureA {
    public void doStuff() {
        // Код на функция А
    }
}

// Разработчик 2 работи в ветката feature/B
// git checkout -b feature/B develop
public class FeatureB {
    public void doOtherStuff() {
        // Код на функция B
    }
}

// След завършване на функция А, ветката се слива в develop
// git checkout develop
// git merge feature/A

// След завършване на функция B, ветката се слива в develop
// git checkout develop
// git merge feature/B // Възможни конфликти с кода от feature/A