Исходя из того, что вы говорите, я бы предложил ветвление для каждой проблемы UAT, а затем объединить их обратно в магистраль, когда UAT закрыта.
Таким образом, вы бы получили:
Main Branch
- Branch R1
- Branch R2
- Branch R3
Все ветви 1, 2 и 3 начинаются в одно и то же время, но R1 и R3 закрыты UAT до R2, и принимается решение начать работу с тем, что у вас есть.
Таким образом, вы можете объединить R1 и R3 в Main, но оставить R2 там, где он есть.
Если бы вы пошли с этим процессом, я бы также предложил:
Main Branch
- Staging Branch
- - Branch R1
- - Branch R2
- - Branch R3
Затем вы можете объединить свои функциональные ветви в промежуточную ветвь и выполнить дополнительное интеграционное тестирование там до слияния с live. Это может помочь разрешить любую конфликтную проблему, которая может возникнуть при объединении двух ветвей функций.
Еще одна вещь, о которой следует помнить при ветвлении между несколькими разработчиками и несколькими выпусками, - это найти способ отследить, какие изменения происходят в какой ветке и в какую ветку они были объединены и куда. Хотя это будет полностью продиктовано вашей рабочей средой и практикой.