#language es 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: [[BrazilianPortugueseUnderstandingMercurial|Brazilian Portuguese]], [[ChineseUnderstandingMercurial|Chinese]], [[FrenchUnderstandingMercurial|French]], [[GermanUnderstandingMercurial|German]], [[ItalianUnderstandingMercurial|Italian]], [[JapaneseUnderstandingMercurial|Japanese]], [[KoreanUnderstandingMercurial|Korean]], [[RussianUnderstandingMercurial|Russian]], [[SpanishUnderstandingMercurial|Spanish]] )'' <> == Que hay en un Repositorio == Los [[Repository|repositorios]] Mercurial contienen un [[WorkingDirectory|directorio de trabajo]] asociado a un sistema de almacenamiento: {{{#!dot digraph G { compound=true; rankdir = LR background="#999999"; subgraph cluster_1 { style=filled; color="#eeeeee"; node [shape=box,style=filled,color=lightgray]; "rev 0" -> "rev 1" -> "rev 2" -> "rev 3"; label = "almacenamiento"; } subgraph cluster_0 { style=filled; color=lightgrey; node [style=filled,color=white]; edge [style=invis]; "main.c"-> "main.h" -> ".hgignore" -> ".hgtags" label="directorio de trabajo"; } "rev 2" -> ".hgtags" [lhead = cluster_0 constraint=false] } }}} 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 [[Tag|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|commit]], el estado del directorio de trabajo relativo a sus [[Parent|padres]] se guarda como una nueva [[Revision|revision]]: {{{#!dot digraph G { compound=true; rankdir = LR background="#999999"; subgraph cluster_1 { style=filled; color="#eeeeee"; node [shape=box,style=filled,color=lightgray]; "rev 0" -> "rev 1" -> "rev 2" -> "rev 3"; "rev 2" -> "rev 4"; label = "almacenamiento"; } subgraph cluster_0 { style=filled; color=lightgrey; node [style=filled,color=white]; edge [style=invis]; "main.c"-> "main.h" -> ".hgignore" -> ".hgtags" label="directorio de trabajo"; } "rev 2" -> ".hgtags" [style = dotted lhead = cluster_0 constraint=false] "rev 4" -> ".hgtags" [lhead = cluster_0 constraint=false] ".hgtags" -> "rev 4" [color = red label = "commit" ltail = cluster_0 constraint=false] } }}} La revisión 4 es una '''[[Branch|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 [[ChangeSet|changesets]] atómico, los cuales son revisiones del proyecto completo. Se les asignan un número secuencia [[RevisionNumber|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 [[ChangeSetID|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". {{{#!dot digraph { rankdir = LR node [shape=box] "rev 0:838e" -> "rev 1:34ef" -> "rev 2:4563" "rev 1:34ef" -> "rev 3:fe56" "rev 2:4563" -> "rev 4:ac98" "rev 3:fe56" -> "rev 4:ac98" "rev 4:ac98" -> "rev 5:0345" "rev 4:ac98" -> "rev 6:19e3 (tip)" label="histórico de ejemplo" } }}} Branches y [[Merge|merges]] en el historial de revisiones pueden ocurrir en cualquier momento. Cada unmerged branch crea un nuevo [[Head|head]] del historial de revisiones. En este ejemplo, revisiones 5 y 6 son heads. Mercurial considera la revisión 6 ser el [[Tip|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: {{{#!dot digraph { label="Alice's Repo" rankdir = LR node [shape=box] a->b->c->d } }}} Bob clona este repo, y termina con una copia completa del repositorio de Alice (¡aunque su directorio de trabajo es independiente!): {{{#!dot digraph { label="Bob's Repo" rankdir = LR node [shape=box] a->b->c->d } }}} Bob hace una serie de cambios ([[Commit|commits]]): {{{#!dot digraph { label="Bob's Repo" rankdir = LR node [shape=box] a->b->c->d->e->f e [color=blue] f [color=blue] } }}} Alice hace sus propios cambios en paralelo: {{{#!dot digraph { label="Alice's Repo" rankdir = LR node [shape=box] a->b->c->d->g g [color=red] } }}} Bob entonces [[Pull|pulls]] el repositorio de Alice para sincronizarlo. Esto copia todos los cambios de Alice en el repositorio de Bob: {{{#!dot digraph { label="Bob's Repo" rankdir = LR node [shape=box] a->b->c->d->e->f e [color=blue] f [color=blue] d->g g [color=red;label="g (tip)"] } }}} 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|merge]] que combina los últimos cambios que el había hecho en ('''f''') con el tipo, aplica los resultados y termina con: {{{#!dot digraph { label="Bob's Repo" rankdir = LR node [shape=box] a->b->c->d->e->f e [color=blue] f [color=blue] d->g g [color=red] f->h g->h h [color=green;label="h (tip)"] } }}} Ahora si Alice '''pulls''' de Bob, ella tendrá los cambios de Bob e, f y h y ellos estarán totalmente sincronizados: {{{#!dot digraph { label="Alice's Repo" rankdir = LR node [shape=box] a->b->c->d->g d->e->f e [color=blue] f [color=blue] g [color=red] f->h g->h h [color=green;label="h (tip)"] } }}} == 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): {{{#!dot digraph { Alice -> Central Central -> Alice Bob -> Central Alice -> Bob Alice -> Carl Carl -> Central Bob -> Carl Carl -> Bob "Carl's Laptop" -> Carl Carl -> "Carl's Laptop" "Carl's Laptop" -> Central Central [style=fill;color=blue;label="Main Public Repo"] label="Una red Mercurial" } }}} == 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]].