Ci sarebbe stato un modo semplice che avrebbe tenuto separato il tuo nuovo sviluppo dal ramo principale senza portarti in questa sfortunata situazione: qualsiasi cambiamento dal tronco avrebbe dovuto essere unito al tuo ramo di sviluppo su base giornaliera . (Il tuo cliente era davvero così miope che non poteva prevedere che un giorno la tua filiale avrebbe dovuto essere rimessa sulla linea principale?)
Ad ogni modo, l'approccio migliore è l'IMHO che cerca di ripetere ciò che sarebbe dovuto accadere in prima persona:
- identificare la semantica delle modifiche sulla riga principale per il giorno 1 dopo la creazione del ramo. Applicali alla tua base di codice attuale così come puoi. Se fosse un "cambiamento locale", dovrebbe essere semplice, se si trattasse di un "refactoring trasversale" come la ridenominazione di una classe ampiamente utilizzata, applicarlo in modo semanticamente equivalente all'attuale base di codice. Spero che durante quell'anno non siano state apportate modifiche contraddittorie trasversali alla base di codice sul "tuo" ramo, altrimenti questo può diventare un vero rompicapo
- testare il risultato (ho già detto che hai bisogno di una buona suite di test per questa attività)? Correggi tutti i bug rilevati dal test
- ora ripeti questo processo per le modifiche sulla riga principale per il giorno 2, quindi il giorno 3 e così via.
Ciò potrebbe funzionare quando i team obbedivano rigorosamente alle regole classiche del controllo della versione ("commetti solo stati compilabili, testati" e "controlla in anticipo e spesso").
Dopo 365 ripetizioni (o 250, se sei fortunato e puoi raggruppare il lavoro per i cambiamenti del fine settimana), avrai quasi finito (quasi, perché devi aggiungere il numero di cambiamenti che accadranno alla linea principale durante il periodo di integrazione ). Il passaggio finale sarà quello di unire nuovamente il ramo di sviluppo aggiornato nel trunk (in modo da non perdere la cronologia del trunk). Questo dovrebbe essere facile, perché tecnicamente dovrebbe essere solo una sostituzione dei file interessati.
E sì, sono serio, probabilmente non c'è scorciatoia per questo. Si potrebbe scoprire che le "porzioni quotidiane" a volte potrebbero essere troppo piccole, ma non me lo aspetto, immagino sia più probabile che le porzioni quotidiane possano rivelarsi troppo grandi. Spero che il tuo cliente ti paghi davvero bene per questo, e che questo è così costoso per lui che imparerà dal suo fallimento.
Vorrei aggiungere che puoi provarlo anche con i lati cambiati - reintegrando le modifiche dal tuo ramo in piccole porzioni alla linea principale. Questo potrebbe essere più semplice quando sul tuo ramo di sviluppo ci sono state molte meno modifiche rispetto al trunk, o la maggior parte delle modifiche sono avvenute in nuovi file di origine che attualmente non fanno parte del trunk. Si può vedere come un "porting" di una funzione da un prodotto A (il ramo di sviluppo) a un prodotto B leggermente diverso (stato attuale del trunk). Ma se la maggior parte delle rifatturazioni trasversali sono state eseguite sulla linea principale e influenzano il tuo nuovo codice (le 6500 collisioni di unione sembrano essere una prova per questo), potrebbe essere più semplice il modo in cui l'ho descritto per primo.