Esta es una pregunta de mejores prácticas, y espero que la respuesta sea "depende". Solo espero aprender más escenarios y flujos de trabajo del mundo real.¿Cómo administrar el desarrollo simultáneo con mercurial?
En primer lugar, estoy hablando de diferentes cambios para el mismo proyecto, por lo que no hay subrepo por favor.
Digamos que tiene su código base en un repositorio de hg. Empiezas a trabajar en una nueva y complicada función A, luego tu brigadista de confianza informa sobre un bug B complicado (tienes testers, ¿no?).
Es trivial si (la solución para) B depende de R. simlply CI a continuación ci B.
Mi pregunta es qué hacer cuando son independientes (o al menos eso parece ahora).
puedo pensar en las siguientes maneras:
- Utilice un clon independiente para B.
- Use ramas anónimas o con nombre, o marcadores, en el mismo repositorio.
- Use MQ (con parche B en la parte superior de A).
- Usar MQ ramificado (lo explicaré más adelante).
- Uso MQ múltiple (desde 1,6)
1 y 2 están cubiertos por una excellent blog por @Steve de Losh enlazadas desde una slightly related question.
La gran ventaja de 1 sobre las otras opciones es que no requiere ninguna reconstrucción cuando se pasa de trabajar en una cosa a otra, porque los archivos están físicamente separados e independientes. Entonces, realmente es la única opción si, por ejemplo, A y/o B tocan un archivo de cabecera que define un booleano tri-estado y está incluido en miles de archivos C (no me diga que no ha visto un código heredado base).
3 es probablemente el más fácil (en términos de configuración y sobrecarga), y puede cambiar el orden de A y B si B es una solución pequeña y/o urgente. Sin embargo, puede ser complicado si A y B tocan el (los) mismo (s) archivo (s). Es fácil solucionar problemas de parches que no se aplicaron si los cambios A y B son ortogonales dentro del mismo archivo (s), pero conceptualmente sigue siendo un poco arriesgado.
4 puede marearlo, pero es la forma más potente, flexible y escalable. De manera predeterminada, hg qinit
con -c
, ya que quiero marcar parches de trabajo en progreso y empujarlos/tirarlos, pero da un salto conceptual para darse cuenta de que también puede bifurcar en el repositorio de MQ.Estos son los pasos (mq = hg --mq):
hg qnew bugA
; hacer cambios para A;hg qref
mq branch branchA; hg qci
hg qpop; mq up -rtip^
hg qnew bugB
; hacer cambios para B;hg qref
mq branch branchB; hg qci
- para trabajar en un nuevo:
hg qpop; mq up branchA; hg qpush
Parece una locura tomar tantos pasos, y cada vez que necesite cambiar el trabajo que debe hg qci; hg qpop; mq up <branch>; hg qpush
. Pero tenga en cuenta esto: tiene varias sucursales de publicación nombradas en el mismo repositorio, y necesita trabajar en varios proyectos y correcciones de errores al mismo tiempo para todos ellos (será mejor que obtenga una bonificación garantizada para este tipo de trabajo). Te perderías muy pronto con los otros enfoques.
Ahora mis compañeros amantes de hg, ¿hay otras/mejores alternativas?
(UPDATE) qqueue
casi hace # 4 obsoleto. Ver la descripción elegante de Steve Losh here.
Como si no fuera obvio, estoy pidiendo un enfoque basado en hg. Pero si puedes darme un solo comando de otro SCM que funcione en todos los casos, estoy abandonando hg. Considéralo un desafío, git aficionados. –
Creo que necesita especificar su problema un poco mejor. ¿Por qué esto no funciona para todos los casos: corregir el error A, confirmar su parche, corregir el error B, confirmar su parche? – Karmastan
Perdón por haber hablado un poco, Spolsky-ishly. Mencioné un caso simple: "si B es una solución pequeña y/o urgente". Una situación más realista es que A y B son proyectos largos que requieren una gran cantidad de compromisos e iteraciones. Además, si tiene un proceso de revisión de código como lo hace mi empresa, es posible que haya terminado A y lo haya enviado para su revisión, y que no pueda quedarse sentado allí esperando a los revisores, así que tendrá que ir a recoger B mientras tanto. . Pero luego el revisor puede explotar tu código y tienes que hacer cambios para complacerlo. Así que puede haber innumerables interruptores de proyectos en el camino. –