La ramificazione dipende un po 'dal supporto VCS per la funzione (ovvero: se il VCS lo rende facile o difficile).
Ma come minimo, vuoi un ramo per ogni versione del tuo progetto supportata indipendentemente. Cioè, se hai "Game 2" e "Game 2 + Expansion" che sono prodotti separati creati dalla stessa base di codice e sui quali devi essere in grado di patchare ed emettere aggiornamenti, allora vuoi avere ognuno di questi esiste nel proprio ramo al di fuori della base di codice principale, in modo che le correzioni alla base di codice principale possano essere unite in ciascuno di questi prodotti in modo indipendente. (In genere, questi rami vengono creati quando viene rilasciato ciascun prodotto, o forse qualche giorno / settimana prima, se nella base di codice sono presenti persone che lavorano su cose che non si desidera uscire con la versione iniziale)
Quando lavori con un VCS che rende l'uso dei rami complicato o doloroso (SourceSafe, svn, ecc.), Probabilmente sarai più felice di mantenere un ramo di "rilascio" per ogni prodotto rilasciato e di fare il tuo sviluppo principale in "trunk", unendo le modifiche da "trunk" ai rami "release" se e quando è necessario rilasciare aggiornamenti rapidi per tali versioni.
Se, d'altra parte, stai lavorando con uno dei più recenti sistemi VCS che si basano su ramificazioni e fusioni (git, Bazaar, Mercurial, ecc.), Allora probabilmente sarai più felice di fare il tuo sviluppo in breve tempo rami "feature" viventi. Ad esempio, se stai lavorando sul pathfinding AI, puoi creare un ramo "pathfinding" e implementare il codice lì dentro. Al termine, unisci nuovamente quel ramo nel tuo tronco principale di sviluppo ed (facoltativamente) elimini il ramo in cui stavi lavorando. Il vantaggio di questo approccio è che ti consente di lavorare su più attività contemporaneamente, invece di doverne completare uno compito prima di iniziare il prossimo.
Nel mio attuale progetto a casa (usando git), ho cinque diversi rami di funzionalità attivi in questo momento, lavorando su varie funzionalità diverse. Due di questi sono approcci alternativi per fare la stessa cosa (per la profilazione), due sono idee di meccanica di gioco sperimentale, e uno è un grande refattore dei miei sistemi di intelligenza artificiale, ed è effettivamente rotto in modo tale che il codice non si compili correttamente adesso. Ma è impegnato nel suo ramo di funzionalità per riferimento e per il backup e la sua rottura non mi impedisce di lavorare sulle altre funzionalità; Gli altri rami delle caratteristiche (e anche il principale tronco di sviluppo) vengono comunque compilati ed eseguiti correttamente.
Nella mia esperienza di sviluppo di giochi professionali per grandi squadre, siamo ancora per lo più bloccati con sistemi di controllo di versione più vecchi (e supportati commercialmente). Perforce è probabilmente il più comunemente usato, seguito da Subversion. Ovunque abbia lavorato, abbiamo avuto un ramo 'trunk' e quindi un ramo 'release' separato per ogni prodotto (pietra miliare / demo / release / ecc.). Occasionalmente qualcuno creerà un ramo personale per alcuni enormi cambiamenti che stanno facendo o testando, ma questo è estremamente raro, e di solito è per cose come "convertire il gioco per funzionare con questa diversa libreria di fisica" che potrebbe non passare effettivamente al prodotto rilasciato.