Технически, @VonC правильно говорит, что ветки - это путь.
Хотя есть одна оговорка. Вы смешиваете две разные парадигмы здесь. SCM (git - инструмент) означает управление исходным кодом и его различными версиями.
Включение / отключение функций продукта - это управление продуктом. По сути, это сводится к разработке и развертыванию вашего приложения.
То, что вы пытаетесь сделать, - это объединить управление функциями вашего продукта с управлением версиями.
Это, безусловно, выполнимо (только через SCM), и, в зависимости от ваших требований, оно может действительно работать на вас.
Тем не менее, со временем вы окажетесь в супе с ветвлением / слиянием. Это не только увеличит время и усилия по поддержанию и поддержанию каждой ветви (и синхронизирует "основную" и другие "ветви"), но также будет контрпродуктивным, так как каждый раз, когда происходит изменение или новая функция, вы тратите больше времени на планирование того, как поддерживать ваши филиалы в актуальном состоянии, чем фактическая функция. Это усложняется с течением времени, когда новые сотрудники не имеют предварительных знаний о методах управления филиалами, и если у вас есть распределенные команды, которые могут захотеть создать свой собственный филиал по разным причинам.
Если я могу предложить, сохраните одну версию вашего приложения и внедрите механизм для включения / отключения «функций». Это сделает ваш SCM более понятным, понятным для внедрения и обслуживания.
Промежуточное звено должно иметь основную ветвь для основного модуля, а затем каждый подмодуль или функция является отдельной ветвью. Любой может установить основной модуль, и в соответствии с необходимостью / разрешением он может пойти и установить отдельные «функции» из своих соответствующих ветвей.
Надеюсь, это обеспечит некоторую ясность. Если у вас есть какие-либо вопросы, я с удовольствием их уточню.