Quali sono le differenze tra la fusione di un intervallo di revisioni e il reintegro in SVN?

Ho letto alcuni documenti e blog sulla differenza tra unire una gamma di revisioni e reintegrare ma non ho avuto una cosa.

Qual è la differenza nell’unione se scelgo l’uno o l’altro modo per unire da un ramo all’altro? Perché unire una serie di revisioni non funziona in alcuni casi, ma reintegrare correttamente unisce il ramo al tronco?

Per prima cosa, il modo in cui SVN calcola le differenze da applicare è diverso tra i due metodi. Normalmente, quando si applica un intervallo di revisioni da X a Y da un trunk al ramo in modalità cherry-picking, ad esempio, SVN calcola le differenze tra le revisioni di X a Y nel trunk e le applica al ramo. Puoi anche fare la stessa cosa nella direzione opposta, applicando le modifiche dal ramo al tronco in questo modo.

Quando reintegrate un ramo nel tronco, tuttavia, SVN esegue un diverso tipo di calcolo. Invece di calcolare la differenza tra le revisioni da X a Y in un ramo e applicare tali modifiche al tronco, SVN calcola semplicemente la differenza tra l’intero ramo e il tronco. Supponendo che tu sia stato diligente nel tenere aggiornato il ramo con le modifiche apportate nel bagagliaio, allora la differenza del calcolo di reintegrazione tra il tronco e il ramo sarà esattamente tutte le modifiche apportate nel ramo che non sono ancora nel bagagliaio

Dalla documentazione SVN 1.6 (Reintegrazione di una succursale):

Tuttavia, quando si unisce il ramo al tronco, la matematica sottostante è molto diversa. Il tuo ramo di funzionalità è ora un miscuglio di entrambe le modifiche di tronco duplicate e le modifiche di ramo privato, quindi non c’è un semplice intervallo contiguo di revisioni da copiare. Specificando l’opzione --reintegrate , stai chiedendo a Subversion di replicare accuratamente solo le modifiche univoche al tuo ramo. (E in effetti, lo fa confrontando l’albero del tronco più recente con l’albero delle filiali più recente: la differenza risultante è esattamente le modifiche del ramo!)

Non sono del tutto sicuro (ho dimenticato nel corso degli anni), ma penso che nelle versioni precedenti di SVN (come prima di 1.5?), Non ci fosse il merge-tracking e nessuna opzione di reintegrazione del ramo, quindi se si voleva unire un ramo completato nel bagagliaio, dovevi farlo manualmente usando invece il metodo delle revisioni. Sto cercando di trovare questo nei documenti, ma non ho ancora trovato un riferimento al riguardo.

Letture aggiuntive

Vedi anche : Perché: --reintegrate necessario per la fusione di svn 1.5? , che è stato sottolineato in questo commento .

reintegrare è pensato per essere utilizzato quando si lavorava su un ramo di funzionalità, e sono fatti. Il prossimo passo dovrebbe essere l’eliminazione del ramo. Prima di reintegrare, dovresti unire la destinazione (più spesso tronco) al ramo usando “intervallo di revisioni” unire per unire tutte le revisioni idonee al ramo. Questo è descritto leggermente sopra il paragrafo di reintegrazione .

L’unione “intervallo di revisioni” è intesa per le revisioni di cherry picking che dovrebbero andare a un determinato ramo, ad esempio per correggere gli errori in un ramo di rilascio stabile.

–reintegrate dovrebbe essere il valore predefinito; se c’è davvero un motivo per cui si desideri fare un sync si unisca diversamente da –reintegrat, potrebbero semplicemente fornire un –sync. –reintegrate è ciò che vorresti comunque quasi sempre, tranne nei casi in cui vuoi cogliere. (Questo è solo il mio 2 centesimi – Non mi considero un esperto di fusione, né capisco perché la loro matematica di sincronizzazione sarebbe diversa dalla loro reintegrazione matematica) – quando mi unisco, quasi sempre voglio e voglio solo i cambiamenti in il ramo sorgente, che non è ancora stato fuso nel ramo di destinazione …