Los sistemas de control de versiones distribuidas fusionan detalles de facilidad

Acabo de leer el blog de Joel sobre los sistemas de control de versiones distribuidas y no puedo entender la idea principal. Él dice que SVN piensa en términos de versiones, mientras que Mercurial piensa en términos de cambios. Y, según Joel, resuelve problemas de fusión.

Escuché esta idea varias veces y todavía no lo he concebido. Como sé, el mecanismo de fusión de SVN también se basa en cambios (diffs). Entonces cuál es la diferencia? No tengo experiencia con los sistemas de control de versiones distribuidas, pero utilizo activamente la derivación / fusión SVN y no tuve problemas serios con ella. Por supuesto, hay conflictos de fusión a veces (cuando se cambió una parte del código en ambas twigs). Pero no veo cómo este problema puede resolverse automáticamente mediante algún tipo de sistema de control de versiones.

De lo que estás hablando con SVN es que algunos types de conflictos de tree no pudieron ser manejados por Subversion y la fusión fallará. En comparación con git, hg y bzr, es cierto que git, hg o bzr pueden manejar estas situaciones. SVN en este momento no lo hace. Recomiendo leer sobre el estudio de licenciatura que se ha realizado y, por supuesto, mientras tanto, algunos de estos problemas se han resuelto.

Compararé SVN con Mercurial, ya que este es el único DVCS que he usado hasta ahora. SVN usa files y hace copys de cada file para cada próxima versión, mientras que los models de Mercurial cambian sets. Tiene su versión completa de file 1.0 en SVN y tiene otra copy de su versión completa de file 1.1. En Mercurial tienes tu file completo una vez en la versión 1.0. Luego tiene una regla como "agregar 2 líneas aquí y eliminar 3 líneas allí" para producir la versión 1.1. Mercurial revisa todo el historial y aplica los cambios a su copy local durante la actualización, pero no almacena en ningún lugar su versión completa del file 1.1.

Sin embargo, el problema que usted describió no se resuelve técnicamente en Mercurial también. Intenté un ejemplo muy simple: permita que dos personas agreguen simultáneamente una línea al final de uno y el mismo file. El primero se compromete y empuja sin problemas. El segundo necesita extraer y actualizar primero, para tomar el último cambio. Y aquí hay un conflicto de fusión, ¡que es molesto! Mercurial no sabe si la segunda persona quiere agregar una línea más o quiere modificar la línea, que acaba de agregar la primera persona. Es lo mismo que SVN aquí, tienes que fusionarte manualmente … Entonces, no hay magia en absoluto 🙂

Puedes leer el http://hginit.com/ para más información.