Este é um problema complicado, mas que muitas pessoas enfrentam. Prefiro usar a configuração do Gitflow como ponto de partida.
Desenvolvimento -> Novos itens sendo trabalhados no
Master -> Novos itens que precisam ser testados Produção -> Novos itens publicados na produção.
Em recursos menores (mais curtos), crio uma ramificação a partir do desenvolvimento, faça o trabalho lá e, em seguida, mesclamos a ramificação de volta ao desenvolvimento.
Nos principais recursos (a longo prazo), crio uma ramificação a partir do desenvolvimento, crio ramificações menores a partir dessa ramificação e, em seguida, volto à primeira ramificação. Depois que o recurso principal estiver concluído, volte ao ramo de desenvolvimento.
A intervalos regulares (depende do projeto), mesclo o desenvolvimento novamente ao mestre e um ciclo de testes começa. Se alguma correção surgir no teste, ela será feita na ramificação principal (sub ramificação e mesclada). E o desenvolvimento pode continuar na ramificação principal durante o teste.
A qualquer momento, o mestre deve ser mesclado ao desenvolvimento, e o desenvolvimento deve ser mesclado a qualquer um de seus sub-ramos de longo prazo.
o mestre deve sempre (em teoria) estar pronto para a produção. O desenvolvimento deve sempre (em teoria) estar pronto para a produção. A única razão pela qual existe uma diferença é fornecer um conjunto sólido de recursos para os testadores testarem.
Quando pronto, uma consolidação no mestre que é testada é mesclada à produção e a implantação na produção acontece a partir dessa ramificação. Os HOTFIXs que precisam ser executados em uma emergência podem ocorrer no ramo Produção sem ter que mesclar no mestre (que pode ter muitas alterações não testadas).
Minha árvore normal parece
LongTerm -> Development -> Master -> Production
LongTerm <- Development | |
| Development -> Master |
LongTerm <- Development -> Master |
Development <- Master |
Master -> Production
É minha regra geral que nenhuma mudança isolada demore mais do que algumas horas. Se isso acontecer, ele precisará ser transformado em alterações menores. Se é um recurso imenso (como uma reescrita da interface do usuário), isso ocorre a longo prazo, para que o desenvolvimento normal possa continuar ao mesmo tempo. As ramificações LongTerm normalmente são apenas ramificações locais, enquanto Desenvolvimento, Mestre e Produção são ramificações remotas. Quaisquer sub-ramificações também são apenas locais. Isso mantém o repositório limpo para outras pessoas, sem perder a utilidade do git em um conjunto de recursos de longo prazo.
Gostaria de observar, no entanto, que a existência de um ramo de longo prazo é algo raro. Normalmente, todo o meu trabalho está em desenvolvimento. Somente quando tenho um recurso (conjunto) que levará tanto tempo que também preciso trabalhar em coisas normais de desenvolvimento, devo usar o ramo LongTerm. Se é apenas um conjunto de mudanças que devem estar juntas, simplesmente não me fundo até que tudo esteja pronto.