2009-09-10 19 views
46

Recientemente cambié de SVN a Mercurial. Ahora me pregunto cómo realizar mi flujo de trabajo de ramificación previsto en Mercurial de acuerdo con las buenas prácticas, con la esperanza de que otros desarrolladores entiendan lo que sucede en el repositorio.Administrar ramas de publicación en Mercurial

Este es el flujo de trabajo:

  1. Por lo general tienen una rama del tronco/default donde trabajo en la serie versión actual pasa. Digamos que es 1.x. Al mismo tiempo, uso una rama 2.x para trabajar en la próxima versión principal. Los cambios en esta rama pueden ser radicales, por lo que fusionarse con la rama trunk/default/1.x no tiene sentido aquí.
    • Después de un tiempo, el trabajo en 2.x puede finalizar y la versión 2.0 se libera. Ahora quiero que la rama 2.x sea la nueva rama predeterminada/troncal y la troncal/troncal predeterminada actual sea la rama 1.x.
    • Repitiendo este proceso, puede venir una nueva rama 3.x. Como antes, si se lanza 3.0, 3.x debería convertirse en la nueva rama predeterminada, mientras que el valor predeterminado en ese momento debería convertirse en la rama 2.x (nuevamente).

Mi pregunta es no si este flujo de trabajo es buena (supongo que no es fundamentalmente erróneo). Mi pregunta es si la forma en que me doy cuenta de esto en Mercurial puede verse como una buena práctica o si hay mejores oportunidades.

Así que aquí es cómo planeo para gestionar ramas en Mercurial ...

A partir de un repositorio con una sola rama que contiene el código de la corriente 1.x serie de lanzamientos:

$ hg init 
$ echo "hello world" > file1.txt 
$ hg ci -A -m "Initial commit of 1.x code" 

empezar a trabajar en 2.x:

$ hg branch 2.x 
$ hg ci -m "Create new branch for 2.x development" 
$ echo "Big new feature for 2.x" > file2.txt 
$ hg ci -A -m "Add big new feature" 

Mientras tanto, hacer un trabajo en serie versión actual (1.x):

$ hg up default 
$ echo "Minor adjustments specific for 1.x" > file3.txt 
$ hg ci -A -m "Minor adjustments" 

Después de un tiempo, la versión 2.0 está lista, yippee! Hacer por defecto rama 1.x a y 2.x a por defecto:

$ hg up default 
$ hg branch 1.x 
$ hg ci -m "Make default branch to 1.x branch" 
$ hg up 2.x 
$ hg ci --close-branch -m "Close branch 2.x" 
$ hg branch --force default 
$ hg ci -m "Make former 2.x branch to new default" 

Ahora crear una nueva rama 3.x y trabajar en ella, también trabajar en predeterminado . Una vez más, después de algún tiempo 3.0 está listo y es hora de volver a gestionar nombres de la rama:

$ hg up default 
$ hg branch --force 2.x # (reuse previously closed 2.x branch name) 
$ hg ci -m "Make default branch to 2.x branch" 
$ hg up 3.x 
$ hg ci --close-branch -m "Close branch 3.x" 
$ hg branch --force default 
$ hg ci -m "Make former 3.x branch to new default" 

El repo ahora puede tener este aspecto ('o' son las cabezas):

o Branch default (3.x) 
| 
| o Branch 2.x 
\| 
    | o Branch 1.x 
    \| 
    | 
    . 

El punto principal No estoy seguro si es reutilizando nombres de rama y haciendo malabares con el nombre de rama por defecto es una buena práctica.

Mucho texto para esa pregunta, lo siento, pero quería dejar en claro lo que estoy haciendo.

+0

[Mercurial wiki] (http://www.mercurial-scm.org/wiki/StandardBranching) proporciona una buena introducción sobre este tema. – xyres

Respuesta

47

Esto es lo que haría:

Hacer default su rama "línea principal". La punta de esta rama es la versión "actualmente lanzada al público" de su código. Las correcciones de errores críticas se pueden asignar directamente a esta rama y fusionarse en ramas de desarrollo.

Para comenzar a trabajar en la versión 2.0, realice una rama 2.0-dev. Confirme los cambios para 2.0 en esa rama y fusione las correcciones de errores críticas de la línea principal (default). Una vez que haya terminado con 2.0, combine 2.0-dev en default y marque el resultado como 2.0.

Hacer las cosas de esta manera significa que no tiene que preocuparse por hacer malabares con los nombres de las sucursales, y puede unir correcciones de errores críticas a la línea principal en las ramas de desarrollo con bastante facilidad.

También se adapta bien cuando trabaja en múltiples versiones futuras a la vez (digamos 2.1 y 3.0). Puede fusionar periódicamente los cambios 2.1 en 3.0 para mantener 3.0 actual.

Usted va a terminar con un gráfico de la siguiente manera:

$ hg glog -l 1000 
@  changeset: 25:efc0096f47c0 tip 
|  summary: Added tag 3.0 for changeset d1a7fc3d7d77 
| 
o  changeset: 24:d1a7fc3d7d77 3.0 
|\  summary: Merge in the redesign changes. 
| | 
| o  changeset: 23:b5b69d24c8f7 3.0-dev 
| |  summary: Finish 3.0 redesign. 
| | 
| o  changeset: 22:4c2f98fac54b 3.0-dev 
|/|  summary: Merge in the latest changes to 2.1/mainline. 
| | 
o |  changeset: 21:37df04521032 
| |  summary: Added tag 2.1 for changeset 39ecc520fc0a 
| | 
o |  changeset: 20:39ecc520fc0a 2.1 
|\ \ summary: 2.1 development is done. 
| | | 
| o | changeset: 19:208f3f9236af 2.1-dev 
| | | summary: Finish the 2.1 work. 
| | | 
| | o changeset: 18:4a024009a9d6 3.0-dev 
| | | summary: More redesign work. 
| | | 
| | o changeset: 17:00c416888c25 3.0-dev 
| |/| summary: Merge in changes from the 2.1 branch to keep the redesign current. 
| | | 
| o | changeset: 16:a57e781a0db1 2.1-dev 
| | | summary: More 2.1 work. 
| | | 
| | o changeset: 15:ddeb65402a61 3.0-dev 
| | | summary: More redesign work. 
| | | 
+---o changeset: 14:90f5d7a8af9a 3.0-dev 
| | | summary: Merge in the fire fixes. 
| | | 
| o | changeset: 13:78a949b67bb9 2.1-dev 
|/| | summary: Merge in the fire fixes. 
| | | 
o | | changeset: 12:6dfe9d856202 
| | | summary: Oh no everything is on fire, fix it in the mainline. 
| | | 
| o | changeset: 11:86767671dcdb 2.1-dev 
| | | summary: Smaller changes for 2.1. 
| | | 
| | o changeset: 10:25dec81d2546 3.0-dev 
| | | summary: Work more on the redesign. 
| | | 
+---o changeset: 9:42c7d689fb24 3.0-dev 
| |  summary: Start working on a complete redesign. 
| | 
| o  changeset: 8:3da99186ca7d 2.1-dev 
|/  summary: Start working on 2.1. 
| 
o  changeset: 7:9ba79361827d 
|  summary: Added tag 2.0 for changeset 755ed5c5e291 
| 
o  changeset: 6:755ed5c5e291 2.0 
|\  summary: Merge in the dev branch for 2.0. 
| | 
| o  changeset: 5:44a833fcc838 2.0-dev 
| |  summary: Finish work on 2.0. 
| | 
| o  changeset: 4:d7ba6aae1651 2.0-dev 
|/|  summary: Merge in the critical fix. 
| | 
o |  changeset: 3:968049f1b33a 
| |  summary: Fix a critical bug on the main branch. 
| | 
| o  changeset: 2:917869609b25 2.0-dev 
| |  summary: More work on the new version. 
| | 
| o  changeset: 1:f95798b9cb2e 2.0-dev 
|/  summary: Start working on version 2.0. 
| 
o  changeset: 0:8a3fb044d3f4 
     summary: Initial commit. 
+2

Oí hablar de este flujo de trabajo como el recomendado pero no estaba seguro de qué tan bien se aplica si hay varios cambios en la línea principal que no tienen sentido para una rama de desarrollo. Supongo que se trata de cómo fusionar los últimos cambios principales en la rama de desarrollo. ¿Cómo manejo los cambios no deseados de la línea principal? ¿Es posible expresar algo así como "Fusionar el conjunto de cambios 23 y 27 desde la línea principal, pero ignorar todos los demás conjuntos de cambios (o deshacerlos después de la fusión)"? –

+4

Si desea fusionar 23 y 27 e ignorar los demás, desea la extensión de trasplante: http://mercurial.selenic.com/wiki/TransplantExtension Si desea fusionar todo y deshacer 23 y 27, se fusionaría normalmente y luego 'hg retroceso 23 --merge; hg backout 27 --merge' mientras está en la rama de desarrollo. –

+2

Creo que el comando 'backout' es el que mejor se adapta a mi propósito. Lo probé y hace lo que quiero hacer. Parece funcionar bien cuando hay solo un par de cambios en el retroceso. De lo contrario, teniendo muchos cambios no deseados, sería engorroso el gráfico del historial y significaría mucho trabajo manual ... pero mientras este no sea el caso, estoy totalmente satisfecho con su sugerencia :) ¡Gracias! –

2

Creo que debe tener en cuenta lo siguiente: a successfull git branching model.

No soy el gran admirador de git, pero este modelo también es muy útil para mercurial.

Cuestiones relacionadas