La mayor diferencia es cómo se registran los nombres de las sucursales en el historial. Con las ramas con nombre, el nombre de la rama se incrusta en cada conjunto de cambios y, por lo tanto, se convertirá en una parte inmutable de la historia. Con los clones no habrá un registro permanente de dónde vino un conjunto de cambios en particular.
Esto significa que los clones son excelentes para experimentos rápidos en los que no desea registrar el nombre de una rama, y las ramas con nombre son buenas para las ramas a largo plazo ("1.x", "2.x" y similares).
Tenga en cuenta también que un único repositorio puede acomodar fácilmente múltiples ramas livianas en Mercurial. Tales ramas en el repositorio pueden marcarse para que pueda encontrarlas fácilmente nuevamente. Digamos que ha clonado el repositorio de la compañía cuando se veía así:
[a] --- [b]
Hackeas y haces [x]
y [y]
:
[a] --- [b] --- [x] --- [y]
Es decir, mientras alguien pone [c]
y [d]
entra en el repositorio, así que cuando tire obtendrá un gráfico de historia como este:
[x] --- [y]
/ /
[a B C D]
Aquí hay dos cabezas en un solo repositorio. Su copia de trabajo siempre reflejará un único conjunto de cambios, la llamada copia de trabajo del conjunto de cambios principal. Comprueba esto con:
% hg parents
Digamos que informa [y]
. Puedes ver las cabezas con
% hg heads
y esto informará [y]
y [d]
. Si desea actualizar su repositorio a un pago limpio de [d]
, simplemente haga (sustituya [d]
con el número de revisión [d]
):
% hg update --clean [d]
Luego verá ese hg parents
informe [d]
. Esto significa que su próximo commit tendrá [d]
como padre. Por lo tanto, puede corregir un error que haya notado en la rama principal y crear un conjunto de cambios [e]
:
[x] --- [y]
/ /
[a B C D e]
Para empujar [e]
solo el conjunto de cambios , debe hacer
% hg push -r [e]
¿Dónde [e]
está el hash changeset? Por defecto hg push
, simplemente comparar los repositorios y ver que [x]
, [y]
y [e]
están desaparecidos, pero es posible que no quieren compartir [x]
y [y]
todavía.
Si la corrección de errores también le afecta, desea fusionarla con su rama de características:
% hg update [y]
% hg merge
Eso dejará su gráfico de repositorio con el siguiente aspecto:
[x] --- [y] ----------- [z]
/ /
[a B C D e]
donde [z]
es la fusión entre [y]
y [e]
. También podrías haber optado por tirar la rama:
% hg strip [x]
Mi punto principal de esta historia es esta: un solo clon puede representar fácilmente varias pistas de desarrollo. Esto siempre ha sido cierto para "hg simple" sin usar ninguna extensión. Sin embargo, la extensión de marcadores es de gran ayuda. Le permitirá asignar nombres (marcadores) a conjuntos de cambios. En el caso anterior, querrá un marcador en su cabeza de desarrollo y uno en la cabeza ascendente. Los marcadores se pueden empujar y extraer con Mercurial 1.6 y se han convertido en una característica incorporada en Mercurial 1.8.
Si hubiera optado por hacer dos clones, su clon de desarrollo se habría visto así después de hacer [x]
y [y]
:
[a] --- [b] --- [x] --- [y]
Y su clon aguas arriba contendrá:
[a] --- [b] --- [c] --- [d]
Ahora notas el error y lo arreglas. Aquí no tiene que hacerlo, hg update
ya que el clon ascendente está listo para usar. Usted se compromete y crea [e]
:
[a] --- [b] --- [c] --- [d] --- [e]
Para incluir la corrección de errores en su clon de desarrollo, tire de ella allí:
[a] --- [b] --- [x] --- [y]
\
[c] --- [d] --- [e]
y fusionar:
[a] --- [b] --- [x] --- [y] --- [z]
\ /
[c] --- [d] --- [e]
El gráfico puede verse diferente, pero tiene la misma estructura y el resultado final es el mismo. Usando los clones, tenías que hacer un poco menos de contabilidad mental.
Las ramas con nombre realmente no entraron en escena aquí porque son bastante opcionales. Mercurial se desarrolló utilizando dos clones durante años antes de cambiar a ramas con nombre. Mantenemos una rama llamada 'estable' además de la rama 'predeterminada' y hacemos nuestros lanzamientos basados en la rama 'estable'. Consulte la página de ramificación estándar en la wiki para obtener una descripción del flujo de trabajo recomendado.