Mercurial-¿Trabajando con colas similares a los estantes?
workflow shelve (3)
- Ejecute
hg qpop -a
para eliminar todos los parches de la pila - 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.