Mentre S.Robins è corretto quando dice che questo è un problema di progettazione e distribuzione non un problema di controllo della versione , dobbiamo essere pragmatici. Se non riesci a riprogettare il tuo prodotto (per utilizzare iniezione di dipendenza per la configurazione, ad esempio), potresti ancora essere in grado di utilizzare il tuo VCS per aiutarti a gestire la complessità introdotta dal tuo design.
Il grosso problema con l'utilizzo delle filiali per mantenere versioni diverse di un prodotto per diversi clienti è la gestione dell'ambito e degli effetti collaterali delle unioni.
Se sviluppi sempre nuove funzionalità al di fuori della filiale specifica del cliente, e solo sempre apporterai modifiche specifiche del cliente nel ramo cliente, allora starai bene. Le nuove funzionalità possono essere estratte dal ramo della funzione e le modifiche del cliente non devono mai essere unite su .
I problemi arrivano quando si tenta di aggiungere una nuova funzione in una filiale del cliente o di correggere un bug e quindi estrarre tali modifiche dal ramo del cliente. Quindi devi essere molto attento per non eseguire modifiche specifiche del cliente insieme a loro.
Avendo già lavorato in un ambiente del genere e sperimentato il dolore di districare un'unione sconsiderata, ora lavorerei in un altro modo se avessi bisogno di supportare nuovamente questo tipo di ambiente.
Inserirò tutte le modifiche specifiche del cliente in una coda di patch, gestita in un repository per cliente separato dal repository di codice principale (o repository).
Con Mercurial , ti suggerisco di dare un'occhiata a Mercurial Queues , un'estensione che viene fornita di serie con TortoiseHg (devi solo abilitarlo). Con git , quindi questa risposta per git equivalente a hg mq? ha alcuni puntatori eccellenti per equivalenti funzionalità git
.