mercurial workflow shelve mercurial-queue

Mercurial-¿Trabajando con colas similares a los estantes?



workflow shelve (3)

  1. Ejecute hg qpop -a para eliminar todos los parches de la pila
  2. Ejecutar hg qpush --move some-patch para aplicar "some-patch" sin aplicar cualquier otro parche que pueda estar antes en la pila de parches

Recientemente comencé a trabajar con MQ ya que me gusta la idea de trabajar en parches aislados y comprometerme sin afectar el repositorio hasta que el conjunto de cambios esté lo suficientemente refinado. Antes de eso, solía trabajar con la extensión de estantes de Mercurial, pero me pareció un poco inestable. Lo que aún estoy tratando de entender en MQ es cómo mantener los parches separados entre sí y aplicarlos sin un orden particular, y en diferentes ramas. Aquí está mi flujo normal -

1. Comience a trabajar en un nuevo parche:

hg qnew fix-bug-1234 -m "fix bug 1234" # do some work hg qrefresh

2. Obtenga una nueva característica / error para trabajar:

hg qpop fix-bug-1234 hg qnew some-feature -m "implement feature X" # some work on feature X (perhaps in a different branch) hg qrefresh

3. En este punto, me gustaría volver a trabajar en la corrección de errores y dejar de lado el trabajo de las características. Pensé que es tan simple como:

hg qpop some-feature hg qpush fix-bug-1234 # wrap up bug fix hg qfinish fix-bug-1234 # get back to work on feature

Sin embargo, MQ parece utilizar siempre el último parche creado en la serie y aplicarlo independientemente del comando qpop / qpush que estoy usando. Debo señalar que los archivos en los que trabajo también están completamente separados (aunque a veces pueden ser los mismos).

¿Me estoy perdiendo de algo? ¿Debo usar hg qqueue para esto? Gracias.


No, no te estás perdiendo nada. La extensión mq supone bastante fuerte que las colas de parches son lineales. Si vas a crear funciones / correcciones de parche múltiple, qqueue funcionaría ... Pero si tus características / correcciones son solo parches individuales y quieres aplicar uno sin aplicar los otros, podría ser más fácil simplemente vuelva a organizar .hg/patches/series (que almacena el orden en que se aplicarán los parches).

Hago esto (y parches de edición a mano) lo suficiente como para tener un alias de shell:

alias viq=''vim $(hg root)/.hg/patches/series''

Alternativamente, si no te importa aplicar varios parches al mismo tiempo, puedes usar qgoto :

$ hg qser 0 U bug-1234 1 U feature-4321 $ hg qgoto feature-4321 $ hg qser 0 A bug-1234 1 A feature-4321


Podrías usar guardias . Le permiten mantener un orden de parches sin reorganizar su archivo de series , y aplicar de forma selectiva solo un subconjunto de parches, aún en forma ordenada por pila.

Un ejemplo en tu caso sería:

hg qnew bugfix # ..hack hack.. hg qrefresh # want to switch over to working on some feature now hg qpop hg qnew feature # ..hack hack.. hg qrefresh

En este punto, estás en una situación en la que la feature parche viene antes de la corrección de bugfix en tu pila. Ahora puede usar protectores para seleccionar uno u otro, y cambiar entre los dos:

hg qpop -a hg qguard feature +featureguard hg qguard bugfix +bugfixguard

Si quieres trabajar en la feature :

hg qselect featureguard hg qpush applying feature now at: feature

Si quieres trabajar en la bugfix de bugfix :

hg qpop -a hg qselect bugfixguard hg qpush applying bugfix now at: bugfix

Tenga en cuenta que desde que seleccionó la bugfixguard protección positiva, la bugfixguard MQ leap-frogged over (porque su guardia positiva era diferente de la seleccionada) y aplicó la corrección de corrección de parche en su lugar (que coincidió con la guardia seleccionada).

Algunas herramientas útiles cuando se trabaja con guardias son hg qseries -v , que mostrará una G lugar de la U habitual para un parche guardado y sin aplicar, y hg qselect -l que mostrará las guardias asociadas con cada parche.