Мой любимый рабочий процесс — master
-less "branch per feature" workflow from Adam Dymitruk (http://dymitruk.com/blog/2012/02/05/branch-per-feature/). Имеет такие филиалы:
- Ровно один
git
in an unbroken line from day 0 up to the version of your app that is currently in production.
- Много
git rebase
branches.
- Один (или, если вам так хочется, больше)
qa
branch.
Жуткие подробности можно найти на сайте Адама, но вкратце:
- Каждый ветка уходит из
qa-...
.
- Все ветки, находящиеся в активном тестировании, объединяются в
qa
.
-
qa-staging
только когда-либо содержит коммиты слияния (т. е. ветки функций, объединенные друг с другом, начиная с qa-acceptance
), никогда прямые манипуляции.
- Всякий раз, когда ветка функций получает новые коммиты, и вы хотите, чтобы они были в
qa
, you rebuild qa
с нуля.
- Всякий раз, когда вы хотите развернуть несколько функций, вы создаете
git rerere
from all of them, test to your heart's content, and then simply rename that branch to the new master
(который, как это началось со старого master
, will be a direct, unbroken line of merge commits from day 0). Then, all feature branches are rebased on that.
- Одной из фундаментально важных частей этого рабочего процесса является возможность
qa
cache feature, and distribute that cache between all developers. Hence, every merge conflict needs to be resolved only once, globally.
Тривиально иметь более одного qa
branch at a time to test different subsets of features; in your case, you could have qa
(все почти готово, т. е. компилируется без ошибок), master
, qa
или что вам нравится.
По моему опыту, всегда существует относительно большая основная, продолжающаяся работа. qa
branch (recreated from the master and features regularly), and when some features are picked for release, the will be a temporary smaller master
.
Добавлять и удалять отдельные функции из набора тривиально. qa
or release-candidate branches on the fly, as those are recreated constantly and only ephemeral.
Вы найдете много людей, которые категорически возражают против feature-...
, but if one wraps their mind around the fact that this is just a tool like any other, it will be fine. You need good tooling for this of course, but this is not complicated to program yourself; the actual master
все команды довольно просты и не требуют пояснений.
Мы расширили рабочий процесс (или, скорее, наши инструменты), чтобы разрешить даже произвольные подфункции (т. е. ветви функций, выходящие из другой ветки функций, а не development
), so multiple branches can go off of a common ancestor which is not yet in production; works like a charm. But you can get pretty far without this.