2010-01-20 10 views
7

Así que ahora mismo estoy aprendiendo Ruby on Rails, y estoy trabajando en el libro "Desarrollo web ágil con rieles". También he decidido que quiero darle una oportunidad a Mercurial, porque he leído sobre SCM distribuidos, y parece una situación ideal. Todavía, sin embargo, prefiero enviar mi código de forma remota a mi VPS de Linux, solo en caso de que mi disco duro decida realizar una inmersión.Ramificación con Mercurial SCM

Por lo tanto, mi pregunta es específica a la bifurcación en Mercurial. En este momento tengo configurado un repositorio remoto y puedo realizar cambios fácilmente a través de SSH (demonios incluso configuré un sitio Nginx FastCGI que también me permite enviar datos). Lo que me gustaría hacer, sin embargo, es crear ramas para cada capítulo a medida que trabajo en ellas, de modo que pueda mantener una buena historia organizada de mi progreso a través del libro. Así que esto es lo que estoy haciendo:

 
$ hg branch chapter-10 
(do chapter 10 stuff) 
$ hg commit -m "Chapter 10 complete" 
$ hg update default 
$ hg merge chapter-10 
$ hg commit -m "Merging chapter 10 into default" 
$ hg push 

Una vez que ejecute la instrucción de empuje, me sale este mensaje de Mercurial:

 
pushing to ssh://myserver/hg/depot 
searching for changes 
abort: push creates new remote branch 'chapter-10'! 
(did you forget to merge? use push -f to force) 

Así que en este punto que trato de hacer un hg merge de nuevo, y me dice que no hay nada que fusionar, lo cual es obviamente cierto porque simplemente lo fusioné. Cuando forzo el empuje con -f, todo parece estar bien, e incluso la interfaz web muestra las ramas apropiadas.

En resumen, mi pregunta es simple: ¿Lo estoy haciendo de la manera correcta? ¿Hay alguna forma más adecuada de hacer esto con Mercurial (es decir, el "camino Mercurial")? Honestamente, solo quiero que el repositorio sirva como respaldo. Soy un fanático del modelo SCM distribuido, pero a mí me parece bastante "sucio" forzar los empujes. ¡Cualquier idea es muy apreciada! Gracias por adelantado.

+0

¿Tiene usted la intención de: a) tener una serie de puntos de control de su trabajo mientras trabaja en los capítulos ob) tener varios capítulos abiertos para editar simultáneamente en diferentes ramas? – Tarydon

+0

La opción A es mi intención aquí, pero en un escenario de equipo también pude ver el valor en la Opción B –

Respuesta

6

push -f es la opción correcta para su caso, y hubo una discusión el mes pasado para agregar ese comando cuando aparece el mensaje de advertencia "push creates new remote branch": vea issue 1513.

Sin embargo, issue 1974 (este mes) menciona algunos efectos indeseables (aunque no en su caso).
Consulte este translated article para obtener más información sobre cómo crear una segunda cabecera en un repositorio remoto.


En el punto más general, se puede utilizar sucursal si usted está escribiendo su capítulo en paralelo, y que desea fusionarlos sólo a cierto punto (estable) en el tiempo

Pero si su proceso de escritura es más lineal, podría usar solo una rama y colocar algunas etiquetas en el camino.
Sin embargo, si vuelve al capítulo 10 y agrega algunas líneas, aunque ya haya puesto las etiquetas 11 y 12, eso dificultaría la lectura del historial.Entonces, las ramas son una buena idea en este caso.

+1

Gracias por los enlaces. Muy informativo. Parece que estoy tratando de usar ramas donde las etiquetas se ajusten mejor. –

4

No conozco su problema específico, pero de sus comentarios parece que usa las ramas donde probablemente quiera usar las etiquetas.

Las ramas se utilizan generalmente cuando varias personas cooperan en el mismo proyecto y desea crear una separación de trabajo para que una persona pueda trabajar en una pieza estable de código, mientras que la otra hace algo experimental que interrumpe temporalmente la funcionalidad. Alternativamente, las ramas se utilizan para estabilizar la liberación, mientras que el desarrollo se realiza en el tronco.

Las etiquetas (o etiquetas) se usan principalmente para crear un marcador que signifique cierta importancia para la versión del código. Como, por ejemplo, si desea marcar una finalización del capítulo 10, simplemente etiquete todas las versiones actuales con una etiqueta 'capítulo-10'. No hay necesidad de ramificarse. Puede ramificar desde una versión etiquetada en cualquier momento en el futuro si fuera necesario por algún motivo.

+0

Estoy de acuerdo. Dado que siempre puedes ir hacia atrás y ramificarte desde cualquier lugar que necesites, crear ramas por adelantado parece ser un caso claro de YAGNI. –

2

En este caso, creo que está totalmente bien utilizar -f para el empuje. Simplemente crea nuevas ramas, no cabezas. Crear cabezas remotas es otro asunto completamente diferente.

Cuestiones relacionadas