Come e / o perché si fonde in Git meglio che in SVN?


Answers

Storicamente, Subversion è stato in grado di eseguire un'unione bidirezionale diretta perché non memorizzava alcuna informazione di unione. Ciò comporta l'adozione di una serie di modifiche e l'applicazione a un albero. Anche con le informazioni di unione, questa è ancora la strategia di unione più comunemente utilizzata.

Git utilizza un algoritmo di fusione a 3 vie per impostazione predefinita, che consiste nel trovare un antenato comune alle teste che vengono unite e che fa uso della conoscenza esistente su entrambi i lati dell'unione. Ciò consente a Git di essere più intelligente nell'evitare i conflitti.

Git ha anche qualche sofisticato codice per la ricerca della rinomina, che aiuta anche. Non memorizza i changeset o memorizza le informazioni di tracciamento: memorizza semplicemente lo stato dei file a ogni commit e utilizza l'euristica per individuare i nomi e i movimenti del codice come richiesto (la memoria su disco è più complicata di così, ma l'interfaccia presenta al livello logico non mostra tracciamento).

Question

In alcuni punti ho sentito che uno dei motivi principali per cui i sistemi di controllo delle versioni distribuiti brillano, è molto più efficace la fusione rispetto agli strumenti tradizionali come SVN. Questo in realtà è dovuto a differenze intrinseche nel modo in cui funzionano i due sistemi, oppure le specifiche implementazioni DVCS come Git / Mercurial hanno solo algoritmi di fusione più intelligenti di SVN?




SVN tiene traccia dei file mentre Git tiene traccia delle modifiche del contenuto . È abbastanza intelligente per tracciare un blocco di codice che è stato rifattorizzato da una classe / file a un'altra. Usano due approcci completamente diversi per rintracciare la tua fonte.

Uso ancora SVN pesantemente, ma sono molto soddisfatto delle poche volte in cui ho usato Git.

Una bella lettura se hai tempo: perché ho scelto Git




Ho letto la risposta accettata. È semplicemente sbagliato.

SVN fusione di SVN può essere un dolore e può anche essere ingombrante. Ma, ignorare come funziona in realtà per un minuto. Non ci sono informazioni che Git tenga o possa dedurre che SVN non conserva o può derivare. Ancora più importante, non vi è alcuna ragione per cui la conservazione di copie separate (a volte parziali) del sistema di controllo della versione fornirà più informazioni effettive. Le due strutture sono completamente equivalenti.

Supponiamo che tu voglia fare "qualcosa di intelligente" Git è "meglio a". E la tua cosa è controllata in SVN.

Converti il ​​tuo SVN nel modulo Git equivalente, fallo in Git, quindi controlla il risultato, magari usando più commit, alcuni rami extra. Se riesci ad immaginare un modo automatico per trasformare un problema SVN in un problema Git, Git non ha alcun vantaggio fondamentale.

Alla fine della giornata, qualsiasi sistema di controllo della versione me lo permetterà

1. Generate a set of objects at a given branch/revision.
2. Provide the difference between a parent child branch/revisions.

Inoltre, per la fusione è anche utile (o critico) sapere

3. The set of changes have been merged into a given branch/revision.

Mercurial , Git e Subversion (ora nativamente, che in precedenza utilizzava svnmerge.py) possono fornire tutte e tre le informazioni. Per dimostrare qualcosa di fondamentalmente migliore con DVC, si prega di indicare una quarta informazione disponibile in Git / Mercurial / DVC non disponibile in SVN / VC centralizzato.

Questo non vuol dire che non siano strumenti migliori!






Related