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 B
all'altro A
, la cronologia del ramo A
conterrà un commit di grandi dimensioni contenente tutte le modifiche apportate in modo esplicito da B
quando è stato ramificato.
Nelle prime versioni di SVN, se è stato necessario unire nuovamente il ramo B
nel ramo A
, è stato necessario specificare manualmente l'intervallo di revisione del ramo che B
si 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
A
da trunk
e fai alcuni commit qui
- Crea filiale
B
da A
e fai alcuni commit qui
- Fai qualche commit in
trunk
eA
- Unisci
B
intrunk
- Unisci
A
inB
- Unisci
A
intrunk
- Unisciti
B
a 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.