Há cerca de meio ano, fui designada para realizar um estudo para responder a essa pergunta. Aqui está o resumo, com base nas referências estudadas (listadas abaixo)
http://msdn.microsoft.com/en-us/library/aa730834%28v=vs.80%29.aspx
... Decidir sobre a melhor estratégia de ramificação é um ato de equilíbrio. Você deve trocar os ganhos de produtividade contra um risco aumentado. Uma maneira de validar uma estratégia escolhida é considerar um cenário de mudança. Por exemplo, se você decidir alinhar ramificações com a arquitetura do sistema (por exemplo, uma ramificação representa um componente do sistema) e esperar mudanças significativas na arquitetura, poderá ser necessário reestruturar suas ramificações e os processos e políticas associados a cada alteração. Escolher uma estratégia de ramificação inadequada pode causar sobrecarga no processo e longos ciclos de integração e liberação que são frustrantes para toda a equipe ...
http://www.cmcrossroads.com/bradapp/acme/branching/
... A integração frequente e incremental é um dos sinais de sucesso, e sua ausência costuma ser uma característica do fracasso. Os métodos atuais de gerenciamento de projetos tendem a evitar modelos estritos de cascata e abraçam os modelos em espiral do desenvolvimento iterativo / incremental e entrega evolutiva. Estratégias de integração incremental, como Merge Early e Freqüentemente e suas variantes, são uma forma de gerenciamento de riscos que tenta liberar o risco mais cedo no ciclo de vida, quando há mais tempo para responder a ele. A regularidade do ritmo entre integrações é vista por [Booch], [McCarthy] e [McConnell] como um indicador líder da saúde do projeto (como um "pulso" ou um "batimento cardíaco").
A integração precoce e frequente não apenas aumenta o risco mais cedo e em pequenos "pedaços", como também comunica mudanças entre colegas de equipe ...
http://www.codinghorror.com/blog/2007/10/software-branching-and-parallel-universes.html
... Na maioria dos sistemas de controle de origem, você pode criar centenas de ramificações sem problemas de desempenho; é a sobrecarga mental de acompanhar todos os galhos com os quais você realmente precisa se preocupar ... Ramificar é um animal complexo. Existem dezenas de maneiras de ramificar, e ninguém pode realmente dizer se você está fazendo certo ou errado ...
http://www.lostechies.com/blogs/derickbailey/archive/2010/02/24/branching-strategies-when-to-branch-and-merge.aspx
... Há muitos aspectos de um sistema a serem considerados ao ramificar seu código ... No final, o objetivo é fornecer uma caixa de proteção para o contexto em que o código está sendo gravado. Compreender as opções disponíveis, quando cada opção é mais adequada à situação atual e o custo dessas opções , ajudará você a decidir como e quando ramificar ...
http://www.snuffybear.com/ucm_branch.htm
Observe outras referências listadas aqui, afirma o autor que "Este artigo descreve três principais modelos de ramificação usados em projetos de engenharia de software" não parece justificado. A terminologia usada não parece generalizada ( EFIX , Model-1,2,3 etc).
http://svn.haxx.se/users/archive-2007-10/att-0101/SCMBranchingModels-talkback.pdf A
referência apresenta um exemplo interessante de dificuldades na comunicação de estratégias de ramificação.
http://simpleprogrammer.com/2010/06/04/simple-branching-strategy-part-1-back-to-basics/
... Mantenha as coisas simples. Trabalhar diretamente fora do porta-malas é de longe a melhor abordagem na minha opinião.
Parece quase heresia quando realmente digito na tela, mas se você me aguentar por um momento, não apenas mostrarei por que acho que isso é essencial para um processo ágil, mas também mostrarei como para fazer funcionar ...
... Se eu tivesse que basear meu raciocínio em um argumento sólido, seria o valor da integração contínua. Eu escrevi no blog sobre o valor do IC e as melhores práticas no passado. Sou um grande defensor da CI ...
... Você realmente tem que perguntar a si mesmo uma pergunta aqui: "É tudo a sobrecarga você está incorrendo de fazer a sua ramificação complicada e fundindo estratégia, resultando em um valor real que não existe mais de uma estratégia mais simples?" ...
.. .Uma estratégia que efetivamente usei no passado e desenvolvi ao longo do tempo. Vou resumir brevemente aqui.
- Todo mundo trabalha fora do porta-malas.
- Ramifique quando você libera o código.
- Ramifique uma versão quando precisar criar uma correção de bug para o código já lançado.
- Ramo para protótipos.
...
http://www.codelathe.com/blog/index.php/2009/07/02/a-svn-branching-strategy-that-works/
... Finalmente, lembre-se de que não há uma estratégia ideal de ramificação e fusão. Depende do seu ambiente de desenvolvimento exclusivo ...
http://blog.perforce.com/blog/?cat=62
... O pior cenário é que você apresenta um problema de "mesclagem semântica", em que o resultado de uma mesclagem automática está incorreto, mas compila OK e passa despercebido teste, possivelmente até sobrevivendo o tempo suficiente para ser um bug visível ao cliente. Eek!
Adicionando insulto à lesão, porque eles podem escapar da detecção por mais tempo, os problemas de mesclagem semântica são mais difíceis de corrigir posteriormente, pois a mudança não é mais recente na mente do desenvolvedor que originou a alteração. (Geralmente, é melhor mesclar as alterações logo após as alterações, de preferência pelo desenvolvedor que originou a alteração, se for prático) ...
https://stackoverflow.com/questions/34975/branching-strategies Os
membros da comunidade compartilham experiências diferentes em vários projetos usando várias estratégias de ramificação. Não há consenso acordado sobre "melhor" ou "pior".
http://www.stickyminds.com/s.asp?F=S16454_COL_2
Essencialmente, um breve resumo do material apresentado em http://oreilly.com/catalog/practicalperforce/chapter/ch07.pdf
- http://www.stickyminds.com/s.asp?F=S16511_COL_2
... Existem três abordagens comuns para decidir quando e como ramificar:
- Crie a ramificação de liberação quando estiver com o "recurso completo" e planeje corrigir problemas de última hora nessa linha de código. Nesse caso, o ramo de lançamento é realmente uma "linha de código de preparação de lançamento", conforme descrito em Padrões de gerenciamento de configuração de software , pois você espera que ainda haja trabalho a ser feito.
- Mude seu estilo de trabalho para evitar o trabalho final de integração, trabalhando fora da linha de desenvolvimento ativa.
- Ramifique para o novo trabalho criando uma ramificação de tarefas e mesclando esse trabalho na linha de desenvolvimento ativa após a conclusão da liberação.
... Uma justificativa para ramificação é isolar o código no final de um release para que ele possa se estabilizar. O isolamento por ramificação muitas vezes oculta um problema de qualidade que acaba se manifestando no custo adicional de manter fluxos paralelos antes que um produto seja lançado. Ramificar é fácil. Em vez disso, é a fusão e a sobrecarga cognitiva de entender como as mudanças fluem entre ramificações que são difíceis, por isso é importante escolher um processo que minimize o custo de ramificação e fusão ...
http://nvie.com/posts/a-successful-git-branching-model/ Estratégia orientada a Git.
... Consideramos origem / mestre como o principal ramo em que o código fonte do HEAD sempre reflete um estado pronto para produção .
Consideramos origem / desenvolvimento como o principal ramo em que o código fonte do HEAD sempre reflete um estado com as últimas alterações de desenvolvimento entregues para a próxima versão. Alguns chamariam isso de "ramo de integração". É aqui que todas as compilações noturnas automáticas são criadas ....
http://svnbook.red-bean.com/en/1.5/svn.branchmerge.html
... as políticas do projeto variam amplamente quanto exatamente quando é apropriado criar uma ramificação de recurso. Alguns projetos nunca usam ramificações de recursos: as confirmações em / trunk são gratuitas. A vantagem desse sistema é que é simples - ninguém precisa aprender sobre ramificação ou fusão. A desvantagem é que o código do tronco geralmente é instável ou inutilizável. Outros projetos usam ramos ao extremo: nenhuma mudança está sempre comprometida com o tronco diretamente. Até as alterações mais triviais são criadas em um ramo de vida curta, cuidadosamente revisadas e mescladas ao tronco. Em seguida, o ramo é excluído. Este sistema garante um tronco excepcionalmente estável e utilizável em todos os momentos, mas ao custo de tremendassobrecarga do processo.
A maioria dos projetos adota uma abordagem intermediária. Eles geralmente insistem que / trunk compila e passa nos testes de regressão o tempo todo. Uma ramificação de recurso é necessária apenas quando uma mudança requer um grande número de confirmações desestabilizadoras. Uma boa regra geral é fazer esta pergunta: se o desenvolvedor trabalhasse por dias isoladamente e depois cometesse a grande alteração de uma só vez (para que / trunk nunca fosse desestabilizado), seria uma alteração muito grande para revisar? Se a resposta para essa pergunta for "sim", a alteração deve ser desenvolvida em um ramo de recurso. À medida que o desenvolvedor efetua alterações incrementais na ramificação, elas podem ser facilmente revisadas pelos pares.
Finalmente, há a questão de como manter melhor um ramo de recursos em "sincronização" com o tronco à medida que o trabalho avança. Como mencionamos anteriormente, há um grande risco de trabalhar em uma filial por semanas ou meses; as alterações no tronco podem continuar a chegar, a ponto de as duas linhas de desenvolvimento diferirem tanto que podem se tornar um pesadelo tentando mesclar o ramo de volta ao tronco.
É melhor evitar essa situação mesclando regularmente alterações de tronco na ramificação. Defina uma política: uma vez por semana, mescle o valor da última semana de alterações de tronco na filial ...
http://thedesignspace.net/MT2archives/000680.html
... Esta seção do tutorial do Eclipse CVS é baseada no artigo de Paul Glezen no site do Eclipse: Ramificação com Eclipse e CVS e é usado com sua permissão sob os termos de a licença EPL. As alterações que estou fazendo na versão dele são principalmente para expandi-lo com mais imagens e explicações passo a passo e integrá-lo aos meus próprios tutoriais para iniciantes, na tentativa de torná-lo mais acessível para iniciantes e designers. Desenvolvedores experientes provavelmente preferirão trabalhar com a versão de Paul ...
http://learnsoftwareprocesses.com/2007/12/29/common-branching-strategies/
... Aqui estão alguns dos modelos comuns de ramificação:
- Modelo de ramificação por liberação: Uma das estratégias de ramificação mais comuns é alinhar ramificações com as liberações de produtos. Uma filial mantém todos os ativos de desenvolvimento de software para uma única liberação. Ocasionalmente, as atualizações precisam ser mescladas de uma versão para outra, mas geralmente nunca são mescladas. As ramificações serão descontinuadas quando uma liberação for retirada.
- Filial por promoção: Outra abordagem muito comum é alinhar filiais com os níveis de promoção de ativos de software. Uma versão de desenvolvimento específica é ramificada em uma ramificação Teste, na qual todos os testes de integração e sistema são executados. Quando você conclui o teste, os ativos de desenvolvimento de software são ramificados na ramificação Produção e, finalmente, implantados.
- Ramificação por tarefa: para evitar sobreposição de tarefas (ou atividades) e perda de produtividade, você pode isolá-las em uma ramificação separada. Lembre-se de que são ramificações de curto prazo que devem ser mescladas assim que a tarefa for concluída; caso contrário, o esforço de mesclagem necessário poderá exceder os benefícios de produtividade de criá-las em primeiro lugar.
- Ramificação por componente: você pode alinhar cada ramificação com a arquitetura do sistema. Nesta estratégia, você ramifica componentes individuais (ou subsistemas). Em seguida, cada equipe que desenvolve um componente decide quando mesclar seu código de volta à linha de desenvolvimento que serve como ramo de integração. Essa estratégia pode funcionar bem se a arquitetura do sistema estiver em vigor e os componentes individuais tiverem interfaces bem definidas. O fato de você desenvolver componentes nas filiais permite um controle mais refinado dos ativos de desenvolvimento de software.
- Filial por Tecnologia: Outra estratégia de ramificação alinhada à arquitetura do sistema. Nesse caso, as filiais estão alinhadas às plataformas de tecnologia. O código comum é gerenciado em uma ramificação separada. Devido à natureza exclusiva dos ativos de desenvolvimento de software gerenciados nas filiais, eles provavelmente nunca se fundem ...
http://msdn.microsoft.com/en-us/library/bb668955.aspx
... Consulte as diretrizes de ramificação e mesclagem em "Diretrizes de controle de origem" neste guia para obter um resumo das diretrizes de ramificação e mesclagem. ... Ao ramificar, considere o seguinte:
- Não ramifique, a menos que sua equipe de desenvolvimento precise trabalhar no mesmo conjunto de arquivos simultaneamente. Se você não tiver certeza disso, poderá rotular uma compilação e criar uma ramificação a partir dessa compilação posteriormente. A mesclagem de ramificações pode ser demorada e complexa, especialmente se houver alterações significativas entre elas.
- Estruture suas árvores de ramificação para que você só precise mesclar ao longo da hierarquia (para cima e para baixo na árvore de ramificação) em vez de atravessar a hierarquia. A ramificação na hierarquia exige que você use uma mesclagem sem base, o que requer mais resolução manual de conflitos.
- A hierarquia da filial é baseada no pai da filial e no filho da filial, que podem ser diferentes da estrutura física do código fonte no disco. Ao planejar suas mesclagens, lembre-se da estrutura lógica da ramificação em vez da estrutura física no disco.
- Não se ramifique muito profundamente. Como leva tempo para executar cada mesclagem e resolver conflitos, uma estrutura de ramificação profunda pode significar que as alterações em uma ramificação filha podem levar muito tempo para serem propagadas para a ramificação principal. Isso pode afetar negativamente os cronogramas do projeto e aumentar o tempo para corrigir bugs.
- Ramifique em alto nível e inclua arquivos de configuração e de origem.
- Evolua sua estrutura de ramificação ao longo do tempo.
- A mesclagem requer que um ou mais desenvolvedores executem a mesclagem e resolvam conflitos. A origem mesclada deve ser exaustivamente testada, pois não é incomum tomar decisões de mesclagem incorretas que podem desestabilizar a compilação.
- A mesclagem na hierarquia de ramificações é especialmente difícil e requer que você lide manualmente com muitos conflitos que poderiam ser tratados automaticamente.
A decisão de criar uma ramificação pode ser reduzida se o custo de mesclar conflitos em tempo real for maior que o custo indireto de mesclar conflitos entre ramificações ...
http://kashfarooq.wordpress.com/2009/11/23/bazaar-branching-strategy-with-a-subversion-trunk/
http://social.msdn.microsoft.com/Forums/en/tfsversioncontrol/thread/f127676c-8f05-410c-9a30-0eb43a26a9fa
discussão sobre as melhores práticas para estratégia de ramificação de isolamento de versão no caso de sistemas em evolução.
http://branchingguidance.codeplex.com/
"Orientação de ramificação do Microsoft Team Foundation Server" - documento enorme e detalhado com recomendações personalizadas para diferentes projetos: aqui a versão HTML . Prova que a Microsoft não acredita em estratégias de ramificação por abordagem de tamanho único.
https://stackoverflow.com/questions/597707/best-branching-strategy-when-doing-continuous-integration
Qual é a melhor estratégia de ramificação a ser usada quando você deseja fazer a integração contínua? ... A resposta depende do tamanho da sua equipe e da qualidade do seu controle de origem e da capacidade de mesclar conjuntos de alterações corretamente complexos ...
- http://www.zeroturnaround.com/blog/continuous-integration-and-feature-branches/
análise mais detalhada da interação de ramificação com integração contínua, com base na experiência concreta com Hudson / Jenkins - junto com algumas referências úteis
. .A minha maior descoberta foi que, embora o IC seja sobre confirmar, forçar e obter feedback com frequência (ou seja, o cluster de IC fornece a você um feedback que sua estação de trabalho nunca poderia fornecer na mesma quantidade de tempo), o verdadeiro IC purista realmente tem mais um requisito - que a equipe precise trabalhar na mesma linha de base ...
Materiais usados
http://codicesoftware.blogspot.com/2010/03/branching-strategies.html
... O CVS e o SVN estavam desencorajando toda a estratégia de ramificação / mesclagem, pois eram totalmente incapazes de fazê-lo ... ... Regra simples: crie uma ramificação de tarefas para cada novo recurso ou correção de bug que você deve implementar ... Pode parecer um exagero para usuários do SVN / CVS, mas você sabe que qualquer SCM moderno permitirá criar ramificações em um segundo, para que não haja sobrecarga real.
Nota importante: se você olhar com cuidado, verá que estou falando sobre o uso de ramificações de tarefas como listas de alterações de homens ricos ...
http://publib.boulder.ibm.com/infocenter/cchelp/v7r0m1/index.jsp?topic=/com.ibm.rational.clearcase.cc_proj.doc/c_bntr_plnbrstrat.htm
... A política de ramificação é influenciada pelo desenvolvimento objetivos do projeto e fornece um mecanismo para controlar a evolução da base de código. Existem tantas variações de política de ramificação quanto organizações que usam o controle de versão do Rational ClearCase. Mas também há semelhanças que refletem a adesão comum às melhores práticas ...
http://blogs.open.collab.net/svn/2007/11/branching-strat.html
... O modelo do Subversion (ou modelo geral de código aberto com mais precisão) é o que está sendo mostrado no modelo de tronco instável. .
http://en.wikipedia.org/wiki/Trunk_%28software%29
No campo de desenvolvimento de software, trunk refere-se ao ramo (versão) não identificado de uma árvore de arquivos sob controle de revisão . O tronco costuma ser a base de um projeto no qual o desenvolvimento progride. Se os desenvolvedores estão trabalhando exclusivamente no tronco, ele sempre contém a versão mais recente do projeto, mas, portanto, também pode ser a versão mais instável. Outra abordagem é separar uma ramificação do tronco, implementar alterações nessa ramificação e mesclar as alterações novamente no tronco quando a ramificação tiver se mostrado estável e funcionando. Dependendo do modo de desenvolvimento e confirmaçãopolítica, o tronco pode conter a versão mais estável ou menos estável ou algo intermediário.
Freqüentemente, o trabalho principal do desenvolvedor ocorre no tronco e as versões estáveis são ramificadas, e correções ocasionais de erros são mescladas das ramificações para o tronco. Quando o desenvolvimento de versões futuras é feito em ramificações que não são de tronco, geralmente é feito para projetos que não são alterados com frequência, ou nos quais se espera que uma mudança demore muito tempo até que esteja pronta para ser incorporada no tronco. .
http://www.mcqueeney.com/roller/page/tom/20060919
... Essas são notas de um seminário on-line sobre as melhores práticas do Subversion , realizado em 30 de agosto de 2006 pela CollabNet. ... Duas estratégias organizacionais: tronco instável vs. tronco estável ... ... PREFERIR um tronco instável quando possível ...
https://stackoverflow.com/questions/153812/subversion-is-trunk-really-the-best-place-for-the-main-development
No SVN, o tronco é o local recomendado para o desenvolvimento principal e eu uso esta convenção para todos os meus projetos. No entanto, isso significa que o tronco às vezes é instável, ou mesmo quebrado ... ... não seria melhor fazer o "desenvolvimento selvagem" em algum ramo como / branch / dev e somente se fundir ao tronco quando a construção é razoavelmente sólido?
- ... O porta-malas é onde o desenvolvimento contínuo deve acontecer. Você realmente não deve ter problemas com o código "quebrado", se todos estiverem testando suas alterações antes de enviá-las. Uma boa regra geral é fazer uma atualização (obtenha todo o código mais recente dos repositórios) depois de codificar suas alterações. Em seguida, crie e faça alguns testes de unidade. Se tudo se compilar e funcionar, você deverá verificar ...
- ... Nope tronco não é o melhor lugar. Em nossa organização, sempre seguimos esta abordagem: o tronco contém código de liberação, portanto, ele sempre compila. Com cada novo lançamento / marco, abrimos um novo ramo. Sempre que um desenvolvedor possui um item, ele cria um novo ramo para esse ramo de lançamento e o funde em um ramo de lançamento somente após testá-lo. O ramo de lançamento é mesclado no tronco após o teste do sistema ...
http://blog.yclian.com/2009/03/working-on-branches-and-stable-trunk.html
... Eu costumava trabalhar no porta-malas porque, para todos os projetos em que trabalhei, era eu o único desenvolvedor ou a equipe garantiu que todos os códigos de check-in passassem nos testes locais. Caso contrário, criamos (ainda) ramificações para correções de bugs, código grande para novos recursos etc.
Cerca de dois meses atrás, eu tive uma curta sessão de git com Kamal e ele compartilhou comigo a ideia de história / ramificação . E quando minha equipe começou a crescer com mais desenvolvedores, sinto a necessidade de incentivar mais ramificações e agora isso se tornou uma regra. Para um projeto com testes automatizados definidos com a configuração do IC, é garantido um tronco estável e essa prática pode se encaixar muito bem nele.
Nós não usamos o git, mas o Subversion, porque foi assim que começamos e ainda estamos confortáveis com ele agora (na maioria das vezes) ...
http://www.ericsink.com/scm/scm_branches.html
Isso faz parte de um livro on-line chamado Source Control HOWTO , um guia de melhores práticas sobre controle de fonte, controle de versão e gerenciamento de configuração ...
... Ramificação preferida de Eric Prática ... Mantenha um tronco "basicamente instável". Faça seu desenvolvimento ativo no tronco, cuja estabilidade aumenta à medida que você se aproxima do lançamento. Após o envio, crie uma ramificação de manutenção e mantenha-a sempre muito estável ...
... No próximo capítulo , abordarei o tópico de mesclagem de ramificações ...
http://marc.info/?l=forrest-dev&m=112504297928196&w=2
Iniciando o correio do thread discutindo estratégias de ramificação para o projeto Apache Forrest
- observe que atualmente o projeto parece usar um modelo de tronco instável com ramificações de liberação:
- "O trabalho de desenvolvimento é realizado no tronco do SVN ... Existem" ramificações de liberação "do SVN, por exemplo, forrest_07_branch." ( diretrizes do projeto )
- "Criando os pacotes candidatos à liberação ... 17. Crie uma ramificação de manutenção no SVN ..." ( Como liberar )
Documentos de ramificação do O'Reilly CVS:
http://commons.oreilly.com/wiki/index.php/Essential_CVS/Using_CVS/Tagging_and_Branching#Basically_stable
- ... A filosofia de ramificação basicamente estável afirma que o tronco deve conter dados do projeto que estão sempre perto de estar prontos para lançamento ... ... Mais variações brandas dessa filosofia permitem que qualquer coisa que passe no teste de unidade do desenvolvedor seja mesclada no tronco. Essa abordagem relaxada exige que um candidato a liberação seja ramificado e submetido a uma análise completa do controle de qualidade antes da publicação ...
- ... A filosofia basicamente instável afirma que o tronco deve conter o código mais recente, independentemente de sua estabilidade, e que os candidatos a lançamento devem ser ramificados para o controle de qualidade.
... Variações mais brandas também permitem ramificações para código experimental, refatoração e outro código de caso especial. A mesclagem de uma ramificação de volta ao tronco é feita pelos gerentes da ramificação. ...
- Observe que o recurso acima não apareceu em nenhuma das pesquisas que realizei (as diretrizes relacionadas ao CVS não são mais populares?)
Práticas recomendadas no SCM (artigo da forforce) em
http://www.perforce.com/perforce/papers/bestpractices.html
... seis áreas gerais da implantação do SCM e algumas práticas recomendadas de granularidade grossa em cada uma dessas áreas. Os capítulos a seguir explicam cada item ...
Áreas de trabalho, linhas de código, ramificação, propagação de alterações, compilações, processos ...