Ci sarebbe stato un modo semplice che avrebbe tenuto il tuo nuovo sviluppo separato dal ramo principale senza portandoti in questa sfortunata situazione: qualsiasi cambiamento dal tronco avrebbe dovuto essere unito al tuo ramo dev < strong> su base giornaliera . (Il tuo cliente è stato davvero così miope da non riuscire a prevedere che il tuo ramo debba essere nuovamente reimmesso nella linea principale un giorno?)
In ogni caso, l'approccio migliore è IMHO che sta tentando di ripetere ciò che avrebbe dovuto accadere in prima persona:
- identifica la semantica delle modifiche sulla riga principale per giorno 1 dopo la creazione del ramo. Applicali al tuo codice attuale come meglio puoi. Se si trattasse di un "cambiamento locale", dovrebbe essere semplice, se si trattasse di un "refactoring cross-through" come la rinomina di una classe ampiamente utilizzata, applicarla in modo semanticamente equivalente al codice attuale. Speriamo che durante quell'anno non siano state apportate modifiche trasversali contraddittorie nella base del codice sul "tuo" ramo, altrimenti questo può diventare un vero rompicapo
- verifica il risultato (ho già detto che hai bisogno di una buona suite di test per questa attività)? Correggi tutti i bug rivelati dal test
- ora ripeti questa procedura per le modifiche sulla linea principale per il giorno 2, quindi il giorno 3 e così via.
Questo potrebbe funzionare quando i team obbediscono rigorosamente alle regole classiche del controllo della versione ("solo impegni compilabili, stati testati" e "check-in anticipato e spesso").
Dopo 365 ripetizioni (o 250, se sei fortunato e puoi raggruppare il lavoro per le modifiche del fine settimana), sarai quasi finito (quasi, perché devi aggiungere il numero di modifiche che avverranno alla linea principale durante il periodo di integrazione). Il passo finale sarà quello di unire nuovamente il ramo dev aggiornato nel bagagliaio (in modo da non perdere la cronologia del tronco). Questo dovrebbe essere facile, perché tecnicamente dovrebbe essere solo una sostituzione dei file interessati.
E sì, sono serio, probabilmente non c'è una scorciatoia per questo. Potrebbe risultare che "porzioni giornaliere" potrebbero essere a volte troppo piccole, ma non mi aspetterei questo, suppongo che sia più probabile che le porzioni giornaliere possano risultare troppo grandi. Spero che il tuo cliente ti paghi molto bene per questo, e che per lui è così costoso che imparerà dal suo fallimento.
Devo aggiungere che puoi provare anche con i lati invertiti, 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 è avvenuta nei nuovi file di origine che attualmente non fanno parte del trunk. Si può vedere questo come "porting" di una caratteristica da un prodotto A (il ramo di sviluppo) a un prodotto leggermente diverso da B (stato attuale del tronco). Ma se la maggior parte dei rifattori incrociati sono fatti sulla linea principale, e influenzano il tuo nuovo codice (le collisioni di fusione 6500 sembrano essere una prova per questo), potrebbe essere più facile il modo in cui l'ho descritto per primo.