I modelli di dati interni sono sostanzialmente diversi.
Fondamentalmente, in SVN, quando guardi la storia di un ramo, vedi solo cosa è successo in quel ramo. Pertanto, quando si unisce da un ramo Ball'altro A, la cronologia del ramo Aconterrà un commit di grandi dimensioni contenente tutte le modifiche apportate in modo esplicito da Bquando è stato ramificato.
Nelle prime versioni di SVN, se è stato necessario unire nuovamente il ramo Bnel ramo A, è stato necessario specificare manualmente l'intervallo di revisione del ramo che Bsi desidera unire per evitare di unire due volte le stesse revisioni. Lo sviluppatore intelligente userebbe ovviamente un messaggio di commit come "Fuso in B: 1234".
SVN 1.5 "risolto" questo. Ma non è cambiato il modo in cui le fusioni vengono applicate fondamentalmente. Ha semplicemente aggiunto alcuni metadati extra al ramo A, facendo sapere a SVN che la revisione 1234 era stata unita, consentendo a SVN di scegliere automaticamente l'intervallo di revisione corretto.
Ma questa soluzione è sostanzialmente una soluzione alternativa per un modello di dati che fondamentalmente non supporta la traccia di ciò che è stato unito.
L'unione di due rami è un esempio relativamente semplice. Ma immaginando questo scenario più complesso
- Crea filiale
Ada trunke fai alcuni commit qui
- Crea filiale
Bda Ae fai alcuni commit qui
- Fai qualche commit in
trunkeA
- Unisci
Bintrunk
- Unisci
AinB
- Unisci
Aintrunk
- Unisciti
Ba trunk(questo non dovrebbe effettivamente fare nulla)
La gestione corretta utilizzando il modello di metadati diventa estremamente complessa (non so se SVN gestisce effettivamente correttamente questo scenario e non mi sento propenso a provarlo).
Gestire questo scenario in git è estremamente semplice.
In git, ogni volta che commetti, l'oggetto interno che rappresenta quel commit contiene un riferimento all'intestazione precedente. Quando si uniscono in un ramo, il commit contiene riferimenti all'intestazione precedente di tutti i rami che vengono uniti (in git è possibile unire più di un ramo alla volta)
Pertanto, quando si esamina la cronologia di un singolo commit in git, è possibile vedere tutta la cronologia, è possibile vedere quando è stata ramificata, quando è stata unita e si può vedere la cronologia di entrambi i rami tra la ramificazione e la fusione.
Pertanto, quando si esegue la fusione in una succursale che è stata parzialmente unita, è estremamente semplice determinare cosa è già stato unito e cosa no.
Non ho esperienza con Mercurial, ma sospetto che i suoi meccanismi interni siano simili a Git.
Fondamentalmente, per SVN, era un obiettivo di progettazione rendere la ramificazione economica. Ma in sostanza, era un obiettivo di progettazione rendere la fusione economica.
Infine, l'ultima volta che ho usato SVN, non è stato in grado di gestire le fusioni, in cui un file è stato rinominato in un ramo e modificato in un altro.