Функциональные ветки, безусловно, значительно усложняют рефакторинг.Они также усложняют непрерывную интеграцию и развертывание, поскольку вы увеличиваете количество параллельных потоков разработки, которые необходимо протестировать.Вы также отказываетесь от основного принципа «непрерывной интеграции» - все работают над одной и той же кодовой базой и «постоянно» интегрируют свои изменения с остальными изменениями команды.Как правило, когда используются ветви функций, ветвь функций не собирается и не тестируется непрерывно, поэтому первый раз, когда код «ветви функций» запускается в процессе производственной сборки / тестирования / развертывания, это когда он «готов» и объединен.в багажник.Это может привести к целому ряду проблем на поздней и критической стадии вашего процесса разработки.
Я придерживаюсь противоречивого мнения, что вам следует избегать ветвей функций при (почти) всех затратах .Стоимость слияния очень высока, и (возможно, что еще более важно) альтернативная стоимость невозможности «непрерывной интеграции» в базу общего кода еще выше.
В своем сценарии вы уверены, что вам нужен отдельныйфункциональная ветвь для каждой клиентской функции?Не могли бы вы вместо этого разработать эти функции в багажнике, но оставить их отключенными, пока они не будут готовы?В общем, я думаю, что лучше разрабатывать «функции» таким способом - зарегистрировать их в транке, даже если они не готовы к работе, но оставить их вне приложения, пока они не будут готовы.Эта практика также побуждает вас сохранять свои компоненты хорошо продуманными и защищенными за хорошо разработанными интерфейсами.Подход «ветвь возможностей» дает вам повод для внесения радикальных изменений в базу кода для реализации новой функции.