A ramificação depende um pouco do suporte do VCS para o recurso (ou seja: se o VCS facilita ou dificulta).
Mas, no mínimo, você deseja uma ramificação para cada versão do seu projeto com suporte independente. Ou seja, se você tiver "Jogo 2" e "Jogo 2 + Expansão", que são produtos separados criados a partir da mesma base de código e para os quais você precisa poder corrigir e emitir atualizações, deseja ter cada um deles existem em sua própria ramificação fora da base de código principal, para que as correções na base de código principal possam ser mescladas em cada um desses produtos independentemente. (Normalmente, essas ramificações são criadas quando cada produto é lançado, ou talvez alguns dias / semanas antes, se houver pessoas trabalhando em coisas na base de código que você não deseja publicar com o lançamento inicial)
Ao trabalhar com um VCS que torna o uso de ramificações complicado ou doloroso (SourceSafe, svn, etc), você provavelmente ficará mais feliz ao manter uma ramificação "release" para cada produto lançado e ao desenvolver seu principal desenvolvimento em "trunk", mesclando alterações de "trunk" nos ramos "release" se e quando você precisar liberar hotfixes para esses releases.
Se, por outro lado, você estiver trabalhando com um dos sistemas VCS mais novos, criados em torno de ramificação e fusão (git, Bazaar, Mercurial, etc.), provavelmente será mais feliz desenvolvendo seu desenvolvimento em muito pouco tempo. ramos "feature" de longa duração. Por exemplo, se você estiver trabalhando no pathfinding do AI, poderá criar uma ramificação "pathfinding" e implementar o código nele. Quando você termina, mescla essa ramificação de volta ao seu tronco principal de desenvolvimento e (opcionalmente) exclui a ramificação na qual estava trabalhando. O benefício dessa abordagem é que ela permite que você trabalhe em várias tarefas simultaneamente, em vez de precisar concluir uma. tarefa antes de iniciar a próxima.
No meu projeto inicial atual (usando git), tenho cinco ramos de recursos diferentes ativos no momento, trabalhando em vários recursos diferentes. Duas delas são abordagens alternativas para fazer a mesma coisa (para criação de perfil), duas são idéias experimentais de mecânica de jogo, e uma é um grande refator dos meus sistemas de IA, e é realmente quebrada de tal maneira que o código não será compilado corretamente agora. Mas está comprometido em seu ramo de recursos para referência e backup, e ser quebrado não me impede de trabalhar nos outros recursos; Essas outras ramificações de recursos (e também o principal tronco de desenvolvimento) ainda são compiladas e executadas corretamente.
Na minha experiência no desenvolvimento profissional de grandes equipes, ainda estamos presos aos sistemas de controle de versão mais antigos (e com suporte comercial). O Perforce é provavelmente o mais usado, seguido pelo Subversion. Em todos os lugares em que trabalhei, tivemos uma ramificação 'tronco' e, em seguida, uma ramificação 'release' separada para cada entrega (marco / demo / release / etc). Ocasionalmente, alguém faz uma ramificação pessoal para uma grande mudança que está fazendo ou testando, mas isso é extremamente raro, e geralmente é para coisas como "converter o jogo para rodar com essa biblioteca de física diferente", que pode não ser realmente realizada. produto lançado.