Se trabalharmos apenas com um ramo no Subversion, deveríamos nos preocupar? Não podemos simplesmente trabalhar no porta-malas para acelerar as coisas?
É assim que desenvolvemos com o Subversion:
- Há um tronco
- Criamos um novo ramo de desenvolvimento
- Desenvolvemos um novo recurso nesse ramo
- Quando o recurso é concluído, ele é mesclado no tronco, a ramificação é removida e uma nova ramificação de desenvolvimento é feita a partir do tronco.
Quando queremos liberar para produção, fazemos uma etiqueta a partir do tronco. As correções são feitas em uma ramificação a partir dessa tag. Esse bugfix é então mesclado no tronco.
É por isso que criamos um novo ramo de desenvolvimento após a conclusão de um recurso. Dessa forma, a correção de bug será incluída em breve em nosso novo código.
Abaixo está um diagrama que deve esclarecer:
Agora, há um sentimento de que essa não é a maneira mais eficiente de trabalhar. Construímos localmente antes de confirmar, o que leva de 5 a 10 minutos. Você pode entender que isso é um tempo de espera bastante longo.
A idéia de um ramo de desenvolvimento é que o tronco esteja sempre pronto para lançamento. Mas isso não é mais verdade em nossa situação. Às vezes, um recurso está quase pronto e alguns desenvolvedores já começam a codificar o próximo recurso (caso contrário, eles esperariam que um ou dois desenvolvedores terminassem e se fundissem).
Então, quando o recurso 1 é concluído, ele é mesclado no tronco, mas com algumas confirmações do recurso 2 incluídas.
Então, devemos nos preocupar com o ramo de desenvolvimento, pois só temos um ramo? Eu tenho lido sobre desenvolvimento baseado em tronco e ramificação por abstração, mas a maioria dos artigos que encontrei focam na parte ramificação por abstração. Tenho a impressão de grandes mudanças que durarão vários lançamentos. Este não é um problema que estamos tendo.
O que você acha? Podemos apenas trabalhar no porta-malas? O pior cenário é (acho) que teríamos que fazer uma tag do tronco e escolher os commits necessários, porque alguns commits / recursos ainda não estão prontos para produção.
Respostas:
O IMHO que trabalha diretamente no tronco é bom se você puder confirmar em pequenos incrementos e se tiver uma integração contínua, para garantir (em uma extensão razoável) que seus commits não quebrem a funcionalidade existente. Também fazemos isso em nosso projeto atual (na verdade, eu não trabalhei em nenhum projeto usando ramificações específicas de tarefas por padrão).
Criamos apenas uma ramificação antes do lançamento, ou se um recurso demorar muito para ser implementado (ou seja, abrange várias iterações / lançamentos). O tamanho aproximado de uma tarefa quase sempre pode ser estimado suficientemente bem, para que possamos saber com antecedência se precisamos de uma ramificação separada para ela. Também sabemos quanto tempo resta para o próximo lançamento (publicamos lançamentos aproximadamente a cada 2 meses), para que seja fácil ver se uma tarefa se encaixa ou não no tempo disponível antes do próximo lançamento. Em caso de dúvida, adiamos até a criação do ramo de lançamento, então não há problema em começar a trabalhar nele no tronco. Até agora, precisávamos criar um ramo específico da tarefa apenas uma vez (em cerca de 3 anos). Claro que seu projeto pode ser diferente.
fonte
O que você está descrevendo com o desenvolvimento de seus recursos é o desenvolvimento paralelo (desenvolvimento simultâneo direcionado a diferentes lançamentos de produtos) e exige ramificações para lidar com isso corretamente. Você pode ter uma ramificação para cada release ou para cada recurso se precisar recompor os recursos que farão um lançamento específico.
A outra maneira de fazer isso seria trabalhar fora do tronco por padrão, mas criar uma ramificação se você espera que sua tarefa ultrapasse a próxima versão. Você sempre marca o lançamento, é claro.
A abordagem adotada depende realmente de quanto gerenciamento você pode fazer antecipadamente. Se o lançamento típico não tiver desenvolvimento paralelo, eu adotaria a segunda abordagem.
fonte