In Subversion (e CVS), il repository è prima di tutto. In git e mercurial non esiste realmente il concetto di repository allo stesso modo; qui i cambiamenti sono il tema centrale.
+1
La seccatura in CVS / SVN deriva dal fatto che questi sistemi non
ricordano la genitorialità dei cambiamenti. In Git e Mercurial, non solo un commit può avere più figli, ma può anche avere più genitori!
Ciò può essere facilmente osservato utilizzando uno degli strumenti grafici, gitk
o hg
view
. Nell'esempio seguente, il ramo n. 2 è stato biforcato dal n. 1 al commit A e da allora è stato unito una volta (in M, unito al commit B):
o---A---o---B---o---C (branch #1)
\ \
o---o---M---X---? (branch #2)
Nota come A e B hanno due figli, mentre M ha due genitori . Queste relazioni vengono registrate nel repository. Supponiamo che il manutentore del ramo n. 2 ora voglia unire le ultime modifiche dal ramo n. 1, può emettere un comando come:
$ git merge branch-1
e lo strumento saprà automaticamente che la base è B - perché è stata registrata nel commit M, un antenato della punta di # 2 - e che deve unire tutto ciò che è accaduto tra B e C. CVS non registra questa informazione , né SVN prima della versione 1.5. In questi sistemi, il grafico sarebbe simile a:
o---A---o---B---o---C (branch #1)
\
o---o---M---X---? (branch #2)
dove M è solo un gigantesco commit "schiacciato" di tutto ciò che è accaduto tra A e B, applicato sopra M. Nota che dopo che l'azione è stata compiuta, non è rimasta traccia (tranne potenzialmente nei commenti leggibili dall'uomo) di dove M ha avuto origine da, né da quanti commit sono stati collassati insieme, rendendo la storia molto più impenetrabile.
Peggio ancora, effettuare una seconda unione diventa un incubo: si deve capire quale base fusione era al momento della prima unione (e uno ha per sapere
che c'è stata una stampa in primo luogo!), Poi presente che informazioni allo strumento in modo che non tenti di riprodurre A..B sopra M. Tutto questo è abbastanza difficile quando si lavora in stretta collaborazione, ma è semplicemente impossibile in un ambiente distribuito.
Un problema (correlato) è che non c'è modo di rispondere alla domanda: "X contiene B?" dove B è una correzione di bug potenzialmente importante. Quindi, perché non registrare queste informazioni nel commit, dato che è noto al momento della fusione!
P.-S. - Non ho esperienza con le capacità di registrazione di unione di SVN 1.5+, ma il flusso di lavoro sembra essere molto più artificioso rispetto ai sistemi distribuiti. Se è davvero così, probabilmente è perché - come menzionato nel commento sopra - l'attenzione è rivolta all'organizzazione del repository piuttosto che alle modifiche stesse.