svn - usados - ¿Qué mejora la fusión de algunos sistemas de control de versiones?
¿qué es un sistema control de versiones centralizado? (5)
He oído que muchos de los VCS distribuidos (git, mercurial, etc.) se fusionan mejor que los tradicionales como Subversion. ¿Qué significa esto? ¿Qué tipo de cosas hacen para mejorar la fusión? ¿Podrían hacerse esas cosas en un VCS tradicional?
Pregunta de bonificación: ¿el nivel de campo de juego de SVN 1.5 es el campo de juego?
El seguimiento de fusión en 1.5 es mejor que no realizar un seguimiento de fusión, pero sigue siendo en gran medida un proceso manual. Me gusta la forma en que registra qué rev''s están y no están fusionados, pero no es casi perfecto.
Merge tiene un buen diálogo en 1.5. Puede elegir qué revisiones desea fusionar individualmente o la rama completa. A continuación, activa la fusión que se produce localmente (y toma FOREVER) cuando luego le da un montón de archivos para leer. Debe verificar lógicamente que cada archivo tenga el comportamiento correcto (preferiblemente ejecutando pruebas unitarias en los archivos) y si tiene conflictos, debe resolverlos. Una vez que esté contento, se compromete su cambio y en ese punto la rama se considera fusionada.
Si lo haces por partes, SVN recordará lo que has dicho previamente que te has fusionado, lo que te permitirá fusionarte. Sin embargo, creo que el proceso y el resultado de algunas de las fusiones son extraños ...
Estos sistemas de control de versiones pueden hacerlo mejor porque tienen más información.
SVN pre-1.5, junto con la mayoría de los VCS antes de la última generación, en realidad no recuerda que fusionó dos commits en cualquier lugar. Recuerda que las dos ramas comparten un antepasado común cuando se separaron por primera vez, pero no sabe de ninguna fusión más reciente que pueda usarse como terreno común.
No sé nada de SVN post 1.5, así que tal vez hayan mejorado en esto.
Las capacidades de fusión de SVN son decentes, y los escenarios simples de fusión funcionan bien, por ejemplo, liberar bifurcaciones y troncales, donde el enlace rastrea los commits en el RB.
Los escenarios más complejos se complican rápido. Por ejemplo, comencemos con una rama stable
( stable
) y trunk
.
Desea hacer una demostración de una nueva característica, y prefiere basarla en stable
ya que es más estable que la trunk
, pero también quiere que todas las confirmaciones se propaguen a la trunk
, mientras que el resto de los desarrolladores aún arreglan las cosas en cosas stable
y en desarrollo en el trunk
.
Entonces creas una rama de demo
, y el gráfico de fusión se ve así:
-
stable -> demo -> trunk
(usted) -
stable -> trunk
(otros desarrolladores)
Pero, ¿qué sucede cuando fusiona los cambios de stable
en demo
, luego combina demo
en trunk
, mientras todo el tiempo otros desarrolladores también se fusionan stable
en trunk
? SVN se confunde con las fusiones de stable
se fusionan dos veces en el trunk
.
Hay formas de evitar esto, pero con git / Bazaar / Mercurial esto simplemente no ocurre: se dan cuenta de si los commits ya se han fusionado porque identifican cada commit en las rutas de fusión que toma.
Respuesta flipante: ¿Por qué algunos lenguajes de programación son mejores en texto / matemática que otros?
Respuesta real: porque tienen que serlo. los VCS distribuidos hacen que gran parte de ellos se fusionen en un punto en el que ninguno de los autores del código en conflicto puede ajustar la combinación manualmente porque la fusión está siendo realizada por un tercero. Como resultado, la herramienta de fusión tiene que hacerlo bien la mayor parte del tiempo.
En contrato con SVN, estás haciendo algo funky (¿y está equivocado?) Si alguna vez terminas fusionando algo en el que no escribiste un lado o el otro.
La mayoría de los VCS de IIRC pueden transferir la fusión a lo que les pidas que usen, por lo que (en teoría) nada impide que SVN use los motores de fusión GIT / mercurial. YMMV
La mayoría de las respuestas parecen ser sobre Subversion, así que aquí tienes una sobre Git (y otros DVCS).
En el sistema de control de versiones distribuidas cuando fusiona una rama en otra, crea una nueva fusión de compromiso , que recuerda cómo resolvió una fusión, y recuerda a todos los padres de una fusión . Esta información simplemente faltaba en Subversion antes de la versión 1.5; Para ello, debe usar herramientas adicionales como SVK o svnmerge. Esta información es muy importante cuando se realiza una combinación repetida.
Gracias a esta información, los sistemas de control de versiones distribuidas (DVCS) pueden encontrar automáticamente ancestros comunes (o antepasados comunes), también conocidos como base de combinación, para dos ramas. Eche un vistazo al diagrama ASCII-art de las revisiones a continuación (espero que no haya sido horriblemente mutilado),
---O---*---*----M---*---*---1 / / /---*---A/--*----2
Si queremos fusionar la rama ''2'' en la rama ''1'', el antecesor común que querríamos utilizar para generar la fusión sería la versión (commit) marcada ''A''. Sin embargo, si el sistema de control de versiones no registra información sobre los padres fusionados (''M'' es fusión anterior de las mismas ramas), no podría encontrar que es commit ''A'', y encontraría commit ''O'' como antecesor común (base de combinación) en su lugar ... que repetiría los cambios ya incluidos y provocaría un gran conflicto de fusión.
El sistema de control de versiones distribuidas tenía que hacerlo bien, es decir, tenían que fusionarse muy fácilmente (sin necesidad de marcar / etiquetar padres fusionados, y suministrar información de fusión a mano) desde el principio, porque la forma de conseguir que otra persona obtuviera el código en el proyecto no fue para darle acceso de confirmación, sino para extraer de su repositorio: obtener confirmaciones del otro repositorio y realizar una fusión.
Puede encontrar información sobre la fusión en Subversion 1.5. en las Notas de la versión de Subversion 1.5 . Aspectos a tener en cuenta: necesita diferentes opciones (!) Para fusionar una bifurcación en un enlace que fusionar el enlace en una bifurcación, también conocido como. no todas las ramas son iguales (en los sistemas de control de versiones distribuidas son [generalmente] técnicamente equivalentes).