Это сложная проблема, но многие сталкиваются с ней. Я предпочитаю использовать настройку Gitflow в качестве отправной точки.
Разработка -> Новые работы над
Master -> Готовые работы, требующие тестирования Производство -> Материал, опубликованный для производства.
При небольших (более коротких) возможностях я создаю ветку от разработки, делаю работу там, затем объединяю ветку с разработкой.
При основных (долгосрочных) возможностях я создаю ветку из разработки, создаю меньшие ветви из этой ветви, а затем возвращаюсь к первой ветви. Как только основная функция завершена, она возвращается в ветку разработки.
Через равные промежутки времени (в зависимости от проекта) я объединяю разработку с мастером, и начинается цикл тестирования. Если в тестировании появляются какие-либо исправления, они вносятся в основную ветвь (тогда подветвь объединяется). И разработка может продолжаться в основной ветке во время тестирования.
В любое время мастер должен быть объединен с разработкой, а разработка должна быть объединена с любой из его долгосрочных подотраслей.
Мастер должен всегда (в теории) быть готовым к производству. Разработка всегда (теоретически) должна быть готова к производству. Единственная причина, по которой есть разница, заключается в том, чтобы предоставить тестировщикам солидный набор функций.
Когда все готово, проверенный коммит в мастере объединяется с производством, а развертывание в производстве происходит из этой ветви. HOTFIXs, которые необходимо выполнить в аварийной ситуации, могут затем выполняться в производственной ветви без необходимости объединения в мастер (что может иметь много не проверенных изменений).
Мое нормальное дерево выглядит так
LongTerm -> Development -> Master -> Production
LongTerm <- Development | |
| Development -> Master |
LongTerm <- Development -> Master |
Development <- Master |
Master -> Production
По моему общему правилу, ни одно изменение не должно занимать более нескольких часов. Если это так, то его нужно внести в более мелкие изменения. Если это огромная функция (например, переписывание пользовательского интерфейса), то это происходит в долгосрочной перспективе, так что нормальная разработка может продолжаться в то же время. Ветви LongTerm, как правило, являются только локальными ветвями, в то время как Development, Master и Production являются удаленными ветвями. Любые подотрасли тоже локальные. Это сохраняет репозиторий в чистоте для других, не теряя полезности git для долгосрочного набора функций.
Однако я хотел бы отметить, что существование долгосрочной ветви является редкостью. Обычно вся моя работа находится в разработке. Я использую ветвь LongTerm только тогда, когда у меня есть функция (набор), которая займет так много времени, что я тоже смогу работать с обычными средствами разработки. Если это просто набор изменений, которые должны быть вместе, то я просто не сливаюсь с мастером, пока все не будет сделано.