El modelo de desarrollo descentralizado de Mercurial puede ser confuso para los nuevos usuarios. Esta página intenta ilustrar algunos de los conceptos básicos. Mira el Tutorial para unas instrucciones paso por paso.
(Traducciones: Brazilian Portuguese, Chinese, French, German, Italian, Japanese, Korean, Russian, Spanish )
Contents
Que hay en un Repositorio
Los repositorios Mercurial contienen un directorio de trabajo asociado a un sistema de almacenamiento:
El soporte de almacenamiento contiene el histórico completo del proyecto. En contraste de los SCMs tradicionales, donde hay una sola copia central de este histórico, cada directorio de trabajo está asociada con una copia privada del histórico. Esto permite que el desarrollo pueda ir en paralelo.
El directorio de trabajo contiene una copia de los ficheros del proyecto en un tiempo determinado (ej rev 2), listos para su edición. Debido a que las etiquetas y los ficheros ignorados también son controlados por cada revisión, están también incluidos.
Aplicando Cambios (Commit)
Cuando haces un commit, el estado del directorio de trabajo relativo a sus padres se guarda como una nueva revision:
La revisión 4 es una rama de la revisión 2, que era la revisión en el directorio de trabajo. Ahora la revisión 4 es el padre de este directorio de trabajo.
Revisiones, Changesets, Heads, and Tip
Mercurial agrupa los cambios de múltiples ficheros a un changesets atómico, los cuales son revisiones del proyecto completo. Se les asignan un número secuencia número de revisión. Debido a que Mercurial permite el desarrollo distribuido y paralelo, estos números de revisión pueden no coincidir entre usuarios. Debido a esto Mercurial también asigna a cada changeset un changeset ID global. Changeset IDs son números hexadecimales de 40 dígitos, pero pueden ser abreviados a un prefíjo unívoco, como "e38487".
Branches y merges en el historial de revisiones pueden ocurrir en cualquier momento. Cada unmerged branch crea un nuevo head del historial de revisiones. En este ejemplo, revisiones 5 y 6 son heads. Mercurial considera la revisión 6 ser el tip del repositorio, el head con el numero mayor de revisión.
Clonando, Haciendo Cambios, Merging, and Pulling
Empecemos con el usuario Alice, cuyo repositorio tiene este aspecto:
Bob clona este repo, y termina con una copia completa del repositorio de Alice (¡aunque su directorio de trabajo es independiente!):
Bob hace una serie de cambios (commits):
Alice hace sus propios cambios en paralelo:
Bob entonces pulls el repositorio de Alice para sincronizarlo. Esto copia todos los cambios de Alice en el repositorio de Bob:
Debido a que la g de Alice es la más nueva en head en el repositorio de Bob, es ahora el tip. Bob entonces hace un merge que combina los últimos cambios que el había hecho en (f) con el tipo, aplica los resultados y termina con:
Ahora si Alice pulls de Bob, ella tendrá los cambios de Bob e, f y h y ellos estarán totalmente sincronizados:
Un Sistema Descentralizado
Mercurial es un sistema completamente descentralizado, y como tal no tiene noción de repositorio central. Por tanto los usuarios son libre de definir sus propia topologías para compartir cambios (mira CommunicatingChanges):
Lo que Mercurial no puede hacer
Muchos usuarios de SVN/CVS esperan tener almacenados los proyectos relacionados todos en un repositorio central. Esto no es para lo que hg se ha hecho, por tanto debes encontrar una manera diferente de trabajar. Esto especialmente significa que no puedes solicitar (checkout) sólo un directorio del repositorio. Si necesitas de verdad gestionar múltiples proyectos en una especie de meta-repositorio, puedes probar la ForestExtension.
Para una introducción práctica en el uso de Mercurial, échale un vistazo al Tutorial.