¿Cuál es la diferencia entre SVN y Git para fusionarse?

Como sugiere el título, tengo curiosidad de por qué tantas personas promocionan a Git como una alternativa superior a la ramificació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.

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

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

Hola Mundo!

Entonces user1 lo cambia a:

¡Hola mundo! 1

entonces user2 lo cambia a:

¡Hola mundo! 12

Luego user2 commits, user1 commits, SVN le daría un conflicto. ¿Puede Git resolver algo tan simple como esto?

Eso se necesita para fusionarse con el conflicto, y ningún VCS lo resolverá nunca por ti.
Tendrás que resolver manualmente la fusión tú mismo.

Como se menciona en Por qué fusionar en git es mejor que SVN , la diferencia real está en el logging histórico de confirmaciones:

  • lineal para SVN
  • DAG (Gráfico acíclico dirigido) para Git

Eso permite que Git recuerde lo que ya se ha fusionado, networkinguciendo considerablemente las ocurrencias de conflictos.

TROZO DE CUERO

Entonces, cuando llega el momento de fusionar de 5b a la twig (a), podemos usar información en el DAG para saber que 3b y 2b ya están hechos


Por lo tanto, es el flujo de trabajo de fusión que Git manejará mucho mejor que SVN:
Ver Merge Git vs. SVN para ejemplos concretos.

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

Sin embargo, Git es probablemente mejor que SVN en el event handling conflictos resueltos. Su estrategia de combinación primaria es recursiva, que encuentra que el ancestro común de dos confirmaciones cambia el mismo file y realiza una combinación de tres vías. También tiene una capacidad incorporada para registrar y reutilizar resoluciones de conflictos ( git-rerere ) y una variedad de otras estrategias de combinación 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 model 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, solo intenta rastrear dónde se produjeron las fusiones, pero su model 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: fusionando A en B y luego B en A.)