как сохранить старые выпуски без создания отдельных долгоживущих веток
Ветви обслуживания часто выполняются для каждого выпуска и являются долгоживущими, поскольку они служат для исправления ошибок, характерных для этого выпуска, и не все нужно объединять обратно в текущую разработку.
1 / Что делать с веткой "maint"? Я так понимаю, указатель "maint" должен быть перемещен в ту же позицию, что и "master"? Как?
Я не уверен, почему вы бы здесь повторно использовали maint. ребаз не сработает.
Может быть
$ git checkout maint
$ git reset --merge c102
Так как 'maint' уже был объединен с master, я думаю, этот сброс не обновит ни один из более новых файлов в master.
Я только что проверил:
альтернативный текст http://img188.imageshack.us/img188/4425/resetmerge.png
Он перемещает ГОЛОВКУ «maint», не затрагивая никаких файлов в master.
2 / Как потом сделать ветку ветки 'maint' из ветки 'master'?
Итак, сброс мог бы переместить головку 'maint' в текущую разработку: если C102 - это v2, все, что вам нужно, это проверить 'maint', и вы сразу же раскошелитесь.
Это даст вам:
альтернативный текст http://img36.imageshack.us/img36/91/resetmerge2.png
3 / если появятся патчи (истекшие очень долго, например, текущий выпуск функции v10.0) для старого «тега: maint-rel v1.0.1», как его интегрировать в «maint» а в "мастер"?
Там вам нужно создать "именованную ветвь обслуживания":
$ git checkout -b maint-1.0 c50
$ # work on patch
$ git checkout maint
$ git cherry-pick ... # only merge what you need in maint
$ git checkout master
$ git cherry-pick ... # only merge what you need in maint
Примечание. Возможно, вы не захотите объединять одно и то же в maint (которому все еще может потребоваться некоторая часть исправления, сделанного в maint-1.0) и master (который, возможно, эволюционировал настолько, что большая часть патча больше не актуальна)