¿Cuáles son los beneficios de Mercurial o git sobre svn para ramificación / fusión?

He escuchado por ejemplo que fusionar twigs con git o mercurial es más fácil que con svn.

Leí a Joel por última vez en la input del blog de software, pero no entendí exactamente por qué. ¿Podría darnos un ejemplo concreto en el que fusionarse con git / mercurial conduzca a less conflictos de fusión en comparación con svn, por favor?

Un ejemplo simple es que git puede convertir automáticamente una fusión en un "avance rápido". Por ejemplo, digamos que tengo una twig que se ve así:

Dominar:

A ---> B ---> C

Y creo una twig de características basada en la Maestra con nuevas confirmaciones D y E.

Característica:

 A --- > B ---> C \ D ---> E 

En svn, cuando fusiona la twig de características de nuevo en maestro, debe crear una confirmación completamente nueva que aplique los cambios de D y E en el Máster. Entonces, parece que:

 Master: A ---> B ---> C -----------------> F Feature: \ / ---> D ---> E --> 

En git tenemos la opción de cómo incorporar la function de twig en el maestro. Si hacemos un

 git rebase feature 

git reconocerá automáticamente que se trata de una fusión trivial y realizará una fusión de avance rápido, que agregará las nuevas confirmaciones a la twig principal. El resultado de la rebase es:

Dominar:

 A ---> B ---> C ---> D ---> E 

Tanto el jefe de la Maestra como el de la Característica apuntan al compromiso E (en otras palabras, se ven exactamente iguales). Una fusión de avance rápido es similar a lo que ocurre cuando se hace una actualización en svn.

Además, tiene la opción de forzar a git para crear una combinación de fusión. Si en cambio lo hacemos:

 git merge feature 

git creará un commit de fusión. El resultado de la fusión es:

 Master: A ---> B ---> C -----------------> F Feature: \ / ---> D ---> E --> 

Commit F es la combinación de D y E.

Compruebe HGINIT fuera. Es un artículo / tutorial de Joel Spolsky (no su última input en el blog) sobre el tema. Es posible que la parte Re-Education de Subversion sea especialmente interesante.

Subversion implementa de manera convincente solo el concepto único: twigs temerosas. Esto significa que una twig siempre es un parent y la otra es feature . La característica puede extraer las actualizaciones de los padres a lo largo del time (fusión), pero el padre puede extraer los cambios de las funciones solo una vez (fusionar –reintegrar) y luego el hijo debe estar cerrado. Es suficiente en muchos casos, pero no siempre. No todas las twigs son twigs de características. Tengo un par de ejemplos.

  1. Primero. Un buen ejemplo es una release branch . Supongamos que está preparando una versión basada en una revisión de tronco exhaustivamente probada. Usted crea una twig de publicación de la revisión de troncal deseada. Ahora no está afectado por ninguna modificación troncal posterior. Pero es posible que desee confirmar las revisiones en la twig de publicación y es posible que desee respaldarlas en el enlace troncal sin cerrar la twig de publicación. Esto no se puede implementar con las twigs de características de svn. Con svn, tendrá que esperar hasta que su twig de liberación ya no sea necesaria y luego reintegrarla. O para respaldar las revisiones a mano.
  2. Segundo. Sucursales por equipo o por desarrollador. No tengas un buen ejemplo de cuándo son realmente útiles, pero seguro que no te gustarán en svn. Será doloroso sincronizar tales twigs.