2010-06-29 14 views
7

Tengo una gran rama nombrada con muchos cambios. Algunos de estos cambios no son destructivos, así que quiero elegir estos archivos específicos primero y fusionarlos con los predeterminados lo antes posible. (Luego, los cambios destructivos se fusionan también.)En Mercurial, ¿cómo selecciono archivos específicos de una rama con nombre para fusionarlos con los valores predeterminados?

En Git crearía otra rama y eliminaría todos los conjuntos de cambios fuera del índice, luego agregaría los archivos específicos al índice y confirmaría. Después de eso, pude fusionar esta rama temporal con el maestro, por lo que el maestro tiene una confirmación limpia con solo el cambio no destructivo. No sé cómo hacer esto con Mercurial.

Respuesta

1

Hasta donde yo sé, Mercurial no tiene herramientas para dividir conjuntos de cambios. Si tiene suerte, todos los cambios que desea están en conjuntos de cambios por separado y luego puede usar el TransplantExtension. Creo que se puede comparar con la selección de cereza de Git, pero no he usado mucho git.

También puede usar hg diff para confirmar manualmente los cambios en un determinado archivo en una nueva rama. Utilice el rango de revoluciones para marcar toda la rama fuente:

hg diff myfile -r startrevision:endrevision 

La salida se puede tratar como un parche. Haga esto para cada archivo que desee y consíguelos y luego fusione. Saltarse los cambios destructivos. También puede, por supuesto, hacer esto varias veces cuando se produce un cambio destructivo en el medio de un rango de revisión.

Habiendo dicho eso lo que estás tratando de hacer no es algo para lo que Mercurial fue creado. Esa edición de historia hardcore es más área de Git (tenga en cuenta que es solo mi opinión). Mantenga sus cambios estables y cambios destructivos en conjuntos de cambios separados (y tal vez incluso en sucursales separadas). Uso transplant, rebase y strip para mover los cambios. Cuando todo está hecho, se combinan y se empujan adecuadamente.

Ah, y marque MercurialQueues. No lo he usado, pero lo he visto hacer algunas cosas locas. Tal vez sea capaz de hacer algo en la línea de lo que quieres.

+0

Puede Yo uso: hg rebase --collapse --keepbranches -b -d Parece poner todos los archivos cambiados en mi directorio de trabajo sin comprometerlos. ¿Hay algún efecto secundario? – Rygu

+0

No he usado rebase para nada más que las cosas más básicas, sugiero que simplemente lea los documentos y lo pruebe a fondo en un repositorio de prueba para descubrir cómo funciona. Y dicho sea de paso, ese comentario es una pregunta perfectamente válida (y separada) para hacer aquí en Stackoverflow. =) – Mizipzor

+0

Mercurial tiene una extensión para dividir conjuntos de cambios: se llama histedit. Usted solo se compromete mientras edita un conjunto de cambios. – Jack

4

Creo que mercurialqueues es lo que quieres. Con mq puede convertir cualquier conjunto de cambios en un parche y cualquier parche en un conjunto de cambios. Así que tomar un conjunto de cambios convirtiéndolo en un parche eliminando los fragmentos del parche que no desea y luego aplicarlo a la rama que desee. Sin embargo, esta es una operación bastante complex y requiere una cierta cantidad de disciplina de su parte. Por lo tanto, trataría de definir su flujo de trabajo en un repositorio de prueba antes de probarlo con el código que le interesa.

+0

Gracias por los enlaces, los revisaré. Por ahora parece que encontré la respuesta (ver comentario arriba). – Rygu

+0

es genial. Básicamente, estaba tratando de dar cierta credibilidad a la respuesta de Mizipzor con respecto a las cosas de mq. –

3

Puede usar hg cat para tomar el contenido de un archivo tal como existe en una rama en particular, y reemplace la versión de copia de trabajo con eso.

Esto no es técnicamente una fusión, pero ya que está reemplazando toda archivos que no debería tener demasiado de un mal momento la fusión de las cosas posteriores:

por ejemplo, para agarrar myfile.c forma rama somefeature, y reemplazar la versión copia de trabajo, hacer:

hg cat path/to/myfile.c -r somefeature > path/to/myfile.c 

nota que este reemplaza completamente el archivo de copia de trabajo así asegurarse de que tiene no hay cambios pendientes primeros

Cuestiones relacionadas