tortoise tag subversion realizar ramas estructura desarrollo create branches svn git version-control mercurial

svn - tag - ¿Por qué las ramificaciones y las fusiones son más fáciles en Mercurial que en Subversion?



svn merge branch to trunk (6)

Manejar múltiples fusiones en sucursales en Subversion o CVS es solo una de esas cosas que deben experimentarse. Es extremadamente fácil hacer un seguimiento de las ramas y las fusiones en Mercurial (y probablemente en cualquier otro sistema distribuido), pero no sé por qué. ¿Alguien más sabe?

Mi pregunta se basa en el hecho de que con Mercurial puede adoptar una práctica de trabajo similar a la del repositorio central de Subversiones / CVS y todo funcionará perfectamente. Puede hacer varias fusiones en la misma sucursal y no necesitará interminables trozos de papel con números de compromiso y nombres de etiquetas.

Sé que la última versión de Subversion tiene la capacidad de rastrear fusiones a sucursales para que no tengas el mismo grado de molestia, pero fue un gran y importante desarrollo de su parte y todavía no hace todo lo que el equipo de desarrollo haría. me gusta hacer eso

Debe haber una diferencia fundamental en la forma en que todo funciona.


En Subversion (y CVS), el repositorio es ante todo. En git y mercurial no existe realmente el concepto de repositorio de la misma manera; aquí los cambios son el tema central.

+1

La molestia en CVS / SVN proviene del hecho de que estos sistemas no recuerdan la paternidad de los cambios. En Git y Mercurial, no solo un commit puede tener varios hijos, sino que también puede tener múltiples padres.

Eso se puede observar fácilmente usando una de las herramientas gráficas, gitk o hg view . En el siguiente ejemplo, la bifurcación # 2 se bifurcó desde el N. ° 1 en el compromiso A, y desde entonces se ha fusionado una vez (en M, fusionado con el compromiso B):

o---A---o---B---o---C (branch #1) / / o---o---M---X---? (branch #2)

Observe cómo A y B tienen dos hijos, mientras que M tiene dos padres . Estas relaciones se registran en el repositorio. Digamos que el mantenedor de la rama # 2 ahora quiere fusionar los últimos cambios de la rama # 1, pueden emitir un comando como:

$ git merge branch-1

y la herramienta sabrá automáticamente que la base es B, porque se grabó en la confirmación M, antecesor de la punta del n. ° 2, y que debe fusionar lo que sucedió entre B y C. CVS no registra esta información , ni tampoco SVN antes de la versión 1.5. En estos sistemas, el gráfico se vería así:

o---A---o---B---o---C (branch #1) / o---o---M---X---? (branch #2)

donde M es simplemente un gigantesco compromiso "aplastado" de todo lo que sucedió entre A y B, aplicado sobre M. Tenga en cuenta que una vez que se realiza la escritura, no queda rastro (excepto potencialmente en comentarios legibles por humanos) de donde M se originaron, ni de cuántos compromisos se colapsaron juntos, haciendo la historia mucho más impenetrable.

Peor aún, realizar una segunda fusión se convierte en una pesadilla: uno tiene que descubrir cuál era la base de fusión en el momento de la primera fusión (¡y uno tiene que saber que ha habido una fusión en primer lugar!), Luego presentar eso información a la herramienta para que no intente reproducir A..B en la parte superior de M. Todo esto es bastante difícil cuando se trabaja en estrecha colaboración, pero es simplemente imposible en un entorno distribuido.

Un problema (relacionado) es que no hay forma de responder la pregunta: "¿X contiene B?" donde B es una solución de error potencialmente importante. Entonces, ¿por qué no simplemente registrar esa información en la confirmación, ya que se conoce en el momento de la fusión?

PD. - No tengo experiencia con SVN 1.5+ fusionar capacidades de grabación, pero el flujo de trabajo parece ser mucho más artificial que en los sistemas distribuidos. Si ese es realmente el caso, probablemente se deba a que, como se menciona en el comentario anterior, el foco se pone en la organización del repositorio y no en los cambios mismos.


En Subversion (y CVS), el repositorio es ante todo. En git y mercurial no existe realmente el concepto de repositorio de la misma manera; aquí los cambios son el tema central.

No he pensado mucho sobre cómo implementaría ninguno, pero mi impresión (basada en una experiencia amarga y mucha lectura) es que esta diferencia es lo que hace que la fusión y la bifurcación sean mucho más sencillas en sistemas sin repositorio.


Porque Subversion (al menos la versión 1.4 y siguientes) no hace un seguimiento de lo que se ha fusionado. Para Subversion, la fusión es básicamente la misma que cualquier confirmación, mientras que en el control de otras versiones como Git, lo que se ha fusionado se recuerda.


Sin ser tocado por ninguna de las respuestas ya proporcionadas, Hg ofreció capacidades de fusión superiores porque usa más información cuando se fusionan los cambios ( hginit.com ):

Por ejemplo, si cambio un poco la función y luego la muevo a otro lugar, Subversion realmente no recuerda esos pasos, así que cuando llegue el momento de fusionarse, podría pensar que una nueva función simplemente apareció de la nada. . Mientras que Mercurial recordará esas cosas por separado: la función cambió, la función se movió, lo que significa que si también cambiaste esa función un poco, es mucho más probable que Mercurial fusione con éxito nuestros cambios.

Por supuesto, recordar lo que se fusionó por última vez (el punto abordado por la mayoría de las respuestas proporcionadas aquí) también es una gran victoria.

Ambas mejoras, sin embargo, son cuestionables ya que subversión 1.5+ almacena información de fusión adicional en forma de propiedades de subversión: esa información disponible, no hay una razón obvia por la cual la fusión de subversión no pudo implementar la fusión tan exitosamente como Hg o Git. No sé si lo hace, sin embargo, parece que los desarrolladores de subversión están en camino de solucionar este problema.


Solo tengo experiencia con Subversion pero puedo decirte que la pantalla de combinación en TortoiseSVN es terriblemente complicada. Afortunadamente incluyen un botón de ejecución en seco para que pueda ver si lo está haciendo bien. La complicación está en la configuración de lo que quiere fusionar a dónde. Una vez que tienes esa configuración para la fusión, la fusión generalmente va bien. Luego debe resolver todos los conflictos y luego confirmar su fusión en la copia de trabajo en el repositorio.

Si Mercurial puede hacer que la configuración de la fusión sea más fácil, entonces puedo decir que haría la fusión 100% más fácil que Subversion.


Supongo que esto podría ser parcialmente porque Subversion tiene la idea de un servidor central junto con una línea de tiempo absoluta de revisiones. Mercurial está verdaderamente distribuido y no tiene tal referencia a una línea de tiempo absoluta. Esto permite que los proyectos de Mercurial formen jerarquías de ramas más complicadas para agregar características y ciclos de prueba por subproyectos; sin embargo, los equipos ahora necesitan mantenerse mucho más activos para mantenerse actualizados ya que no pueden simplemente actualizar y terminar con esto. .