2010-04-22 5 views
18

Como el título sugiere, tengo curiosidad de por qué tantas personas promocionan a Git como una alternativa superior a la bifurcación/fusión a través de SVN. Principalmente me siento curioso porque la fusión de SVN apesta y me gustaría una solución alternativa.¿Cuál es la diferencia entre SVN y Git para la fusión?

¿Cómo maneja Git la fusión mejor? ¿Como funciona?

Por ejemplo, en el SVN, si tengo la siguiente línea:

Hello World!

Entonces usuario1 lo cambia a:

Hello World 1

continuación, usuario2 lo cambia a:

Hello World 12

Entonces usuario2 comete, a continuación, usuario1 comete, SVN haría darte un conflicto ¿Puede Git resolver algo tan simple como esto?

+23

git no puede leer su mente más que svn. – Ether

Respuesta

26

Llamado a fusionarse con conflicto, y ningún VCS lo resolverá nunca por usted.
Deberá resolver manualmente la fusión usted mismo.

Como se mencionó en Why merging in git is better than SVN, la diferencia real está en la grabación de la historia de confirmaciones:

que permite a Git para recordar lo que ya se ha fusionado, reduciendo considerablemente las ocurrencias de conflictos.

DAG

Así, cuando llega el momento de hacer fusionar de 5b a la (a) rama, podemos utilizar la información en el DAG para saber que 3b y 2b ya están hechos


por lo tanto, es el merge worflow que Git manejar mucho más gracia que SVN:
Ver Merge Git vs. SVN de ejemplos concretos.

+0

@VonC: Pero el suyo tiene una bonita imagen, y un enlace para responder sobre la incapacidad de SVN para fusionarse, que realmente no pude proporcionarle. +1! – Cascabel

+0

@Jefromi: sí, me gusta la imagen bonita;) Acabo de agregar una referencia a otra pregunta de SO que ilustra muy bien las dificultades (para SVN) para gestionar los "patrones de fusión más complejos" a los que alude en su respuesta. – VonC

+0

¿Cómo hiciste esa foto? –

13

El conflicto específico que menciona es siempre no resuelto. Simplemente no hay forma de que una herramienta de fusión sepa qué versión se debe guardar.

Sin embargo, Git es probablemente mejor que SVN en el manejo de conflictos resueltos. Su estrategia de combinación primaria es recursiva, que encuentra que el ancestro común de dos confirmaciones cambia el mismo archivo y realiza una combinación de tres vías. También tiene una función incorporada para registrar y reutilizar resoluciones de conflictos (git-rerere) y una variedad de otros merge strategies para casos especiales.

La ventaja de Git en la fusión es que es parte de la historia. Un commit de fusión es un commit con dos padres. El modelo de historia de Git (un gráfico acíclico dirigido) espera que haya compromisos como este.Esto significa que más se fusiona en el trabajo futuro exactamente cómo deberían. Siempre. (Sí, a veces hay conflictos, pero son conflictos reales, no una incapacidad para manejar la fusión.)

SVN, por otro lado, simplemente trata de rastrear dónde se produjeron las fusiones, pero su modelo sigue siendo intrínsecamente lineal . La historia todavía tiene una sola cadena de confirmaciones, con información de seguimiento de fusión que proporciona ayuda adicional. Por lo que he escuchado, SVN no siempre puede manejar patrones de combinación más complejos correctamente. (Un ejemplo es una fusión reflexiva: fusionar A en B y luego B en A.)

+0

¡Fui el primero! ¡Durante 50 segundos! ... Pero seamos sinceros, tu respuesta es mucho más detallada y precisa;) +1 – VonC

Cuestiones relacionadas