Cuando se trata de fusionar, cada versión de control tiene su motor para hacerlo. Los conflictos son inevitables, pero la pregunta es: qué control de revisión tiene la mejor IA para evitar conflictos.
¿Es posible medir tal cosa?
Más específicamente, estamos pensando en pasar a GIT porque tiene una buena publicidad y rumores que manejan mejor los conflictos ...
Cualquier comentario es apreciado ...
version-control
confiq
fuente
fuente
Respuestas:
No creo que esta sea la pregunta correcta.
El problema es que hay muchos casos de esquina, y los algoritmos "inteligentes" para la fusión pueden engañarse a sí mismos y pensar que han hecho la fusión correctamente cuando de hecho han borrado completamente su código. Si tienes suerte, una fusión tan mala provoca un fallo en tiempo de compilación. Si no tienes suerte, puede introducir un error sutil que lleva años rastrear.
Git usa un algoritmo de fusión bastante sencillo y levanta las manos y pide ayuda si no puede hacer la fusión. En mi opinión, esto es exactamente lo que quieres que haga tu sistema de control de versiones. Vale la pena el tiempo que le lleva solucionar los conflictos manualmente. (Además, si hay conflictos en una fusión, git enumera los archivos en conflicto en su mensaje de confirmación autogenerado para usted; esto es muy útil para encontrar errores cuando revisa su historial de código).
fuente
Se ha dicho que el mejor algoritmo es el álgebra de parches de Darcs . Codeville también tiene un algoritmo interesante en desarrollo.
Sin embargo, por todas las razones prácticas, cualquier herramienta que utilice la combinación de tres vías funcionará . Esto incluye git (con variantes), mercurial, bazar y muchas herramientas externas (excepciones notables: opendiff y caleidoscopio en Mac), por lo que es muy probable que ya esté utilizando las mejores opciones; Como señaló @Peter, hay casos en los que ningún algoritmo puede ayudarlo.
fuente
Uso git y mercurial pero tu pregunta recuerda la teoría del parche de darcs. Tendrás tarea de lectura para este fin de semana.
PD: No me pidas la teoría de los parches, es muy complejo para mí :)
fuente
Se llama Control de Revisión Humana. (Motor de fusión humana)
Utilizamos Seapine Surround y, en su mayor parte, hace un buen trabajo de fusión, pero la única forma de solucionar los conflictos de fusión que el control de fuente no puede hacer es a través de la intervención humana.
Entonces, mi consejo es:
Intenta fusionarte rápidamente. Una pesadilla fue tener una sucursal que no se unió a la línea principal durante casi 2 años. Cuando se fusionó, muchos conflictos debían resolverse. Un desarrollador se ganó el apodo de "maestro de fusión" después de pasar mucho tiempo arreglando problemas de fusión.
Tenga cuidado con el código generado automáticamente por los asistentes, etc. En algún momento, esto puede ser un verdadero problema para combinar, especialmente si dos ramas generan cambios automáticamente en el mismo archivo.
Intenta controlar el desarrollo. Si el desarrollador A está desgarrando los archivos de código X e Y, no tiene mucho sentido que el desarrollador B trabaje en X e Y en una rama diferente. Parte de la gestión de fusión es intentar controlar lo que se está modificando para evitar posibles conflictos de fusión.
Esto no quiere decir que 2 desarrolladores no puedan trabajar en el mismo archivo en 2 ramas diferentes. Si 1 desarrollador agrega el método A y otro agrega el método B, entonces la fusión debería ocurrir sin problemas.
Al final siempre habrá algunos conflictos que necesitarán intervención humana. Al mantenerlos al mínimo, obtendrá los mejores resultados de fusión.
fuente
El motor de fusión perfecto comprendería la semántica del archivo que se está fusionando: por lo tanto, analiza y comprende el código fuente. Todavía tengo que ver ese motor de fusión / control de versiones ...
La mayoría de las herramientas de fusión combinan archivos como texto. Por lo tanto, nunca confiaría en ellos a ciegas, siempre es una buena idea revisar los cambios antes de enviarlos a su sucursal.
Estamos utilizando Perforce, que no se fusiona automáticamente. Siempre que el archivo de origen cambie en relación con la base común, dirá que el archivo de destino debe resolverse incluso si no hay conflicto. Así que abro la herramienta de combinación solo para pensar rápidamente en los trozos para verificar si encajan (y obtener una idea aproximada de lo que están haciendo otros compañeros), la mayoría de las veces encajarán y aceptarán el resultado.
También me suscribí a las notificaciones de cambio de la línea principal, así que combino los cambios en mi sucursal lo antes posible para poder evitar problemas más adelante.
fuente
Erm ...
Cuando usas mercurial (y git también, estoy razonablemente seguro) eliges tu motor de fusión, por defecto es kdiff3 pero puedes usar lo que quieras (más allá de comparar, p4merge, etc.).
AFAIK, el motor de fusión y VCS a menudo están completamente separados , algo así como su compilador y editor de texto. Tome el código XML vs, por ejemplo, va a querer fusionar diferentes cosas, no funcionan de la misma manera y, por lo tanto, no se pueden fusionar de la misma manera.
Si está cambiando el control de versión porque necesita una mejor herramienta de combinación, lo está haciendo por razones equivocadas, solo debe cambiar el control de versión cuando el que está usando ahora no se ajusta bien a su proceso (u otro lo haría). Permitirle utilizar un mejor proceso).
fuente
En mi opinión, qué tan bien un VCS maneja los conflictos dentro de un archivo está un poco sobrevalorado. Por un lado, la mejor manera de lidiar con tales conflictos es no tenerlos en primer lugar. Factorizar bien su software y dividir las tareas con previsión reducirá enormemente los conflictos dentro de un grupo de archivos (y mucho menos dentro de un archivo). Haga un mal trabajo, como agregar demasiadas clases de dios, o un archivo de configuración común que todos tengan que usar y todos quieran entrometerse y esté pidiendo conflictos a nivel de archivo.
Por otro lado, todos usan el mismo algoritmo (pésimo). Un ejemplo: una versión alfa de nuestro proyecto tuvo una pérdida menor de memoria. Fue más un goteo que una fuga, y la fuga se detuvo al final del tiempo de inicialización. Digno de una solución, no digno de un parche. Uno de nuestros clientes "solucionó" el problema, colocando la versión gratuita en el lugar equivocado. El problema se solucionó en la próxima versión. Este cliente fusionó la nueva versión en lugar de hacer un reemplazo completo (WTF?). No hubo conflictos en la fusión a tres bandas; Las llamadas a la libertad estaban bien aisladas unas de otras. Así que ahora el software está cayendo núcleo debido a un doble libre.
Lo que se está perdiendo en la discusión es cuán difícil / lento / propenso a errores es fusionar su trabajo nuevamente en la línea principal del software.
En svn, tu
Son muchos pasos no atómicos, demasiados lugares donde los errores pueden colarse (los conflictos de los árboles son desagradables), y lleva demasiado tiempo. He visto múltiples proyectos que renunciaron al uso de ramas con subversión gracias en gran parte al proceso de fusión que es tan lento y propenso a errores. He visto incluso más proyectos pasar de la subversión en gran parte debido a esto.
fuente
Hay un pequeño conjunto de pruebas llamado merge, que compara el sistema de control de revisión con escenarios de fusión del mundo real. Para cada escenario, se asegura de que un VCS pueda hacer lo siguiente correctamente:
Según el número de pruebas aprobadas en la combinación, parece que hay dos niveles de rendimiento:
Según los lenguajes de programación que intente fusionar, los resultados exactos de la prueba pueden ser importantes. Consulte el sitio web del proyecto para obtener una tabla de comparación detallada.
fuente
He usado IBM / Rational ClearCase y su fusión de múltiples sucursales es simplemente increíble. Ejecuta anillos alrededor de la subversión. (Sin experiencia de Git o mercurial).
fuente