El movimiento mercurial cambia a una nueva sucursal

Respuestas:

153

Como lo sugiere Mark, MqExtension es una solución para su problema. En mi humilde opinión, un flujo de trabajo más simple es utilizar la extensión rebase . Supongamos que tiene una historia como esta:

@  changeset:   2:81b92083cb1d
|  tag:         tip
|  summary:     my new feature: edit file a
|
o  changeset:   1:8bdc4508ac7b
|  summary:     my new feature: add file b
|
o  changeset:   0:d554afd54164
   summary:     initial

Esto significa que la revisión 0es la base sobre la que comenzó a trabajar en su función. Ahora quiere tener revisiones 1-2en una rama con nombre, digamos my-feature. Actualice a revisión 0y cree esa rama:

$ hg up 0
$ hg branch my-feature
$ hg ci -m "start new branch my-feature"

La historia ahora se ve así:

@  changeset:   3:b5939750b911
|  branch:      my-feature
|  tag:         tip
|  parent:      0:d554afd54164
|  summary:     start new branch my-feature
|
| o  changeset:   2:81b92083cb1d
| |  summary:     my new feature: edit file a
| |
| o  changeset:   1:8bdc4508ac7b
|/   summary:     my new feature: add file b
|
o  changeset:   0:d554afd54164
   summary:     initial

Use el rebasecomando para mover las revisiones 1-2a la revisión 3:

$ hg rebase -s 1 -d 3

Esto da como resultado el siguiente gráfico:

@  changeset:   3:88a90f9bbde7
|  branch:      my-feature
|  tag:         tip
|  summary:     my new feature: edit file a
|
o  changeset:   2:38f5adf2cf4b
|  branch:      my-feature
|  summary:     my new feature: add file b
|
o  changeset:   1:b5939750b911
|  branch:      my-feature
|  summary:     start new branch my-feature
|
o  changeset:   0:d554afd54164
   summary:     initial

Eso es todo ... como se menciona en los comentarios a la respuesta de Mark, moverse por conjuntos de cambios ya empujados generalmente es una mala idea, a menos que trabaje en un equipo pequeño donde pueda comunicarse y hacer cumplir su manipulación de la historia.

Oben Sonne
fuente
44
En mi humilde opinión, el inconveniente de esta solución es que introduce una confirmación ficticia "iniciar nueva rama my-feature" (es decir, una que no cambia ningún archivo).
sschuberth
9
@sschuberth: Creo que ser explícito es algo bueno aquí. Si el conjunto de cambios adicional es un problema para usted, combínelo con el siguiente (por ejemplo, utilizando el foldcomando de la extensión histedit ahora incorporada ).
Oben Sonne el
66
@AmirRachum: hg log -G( GraphlogExtension ). Eliminé algunas líneas manualmente, pero también podría haberse renderizado de forma completamente automática utilizando estilos de registro personalizados .
Oben Sonne
2
Habilite la extensión de rebase : mercurial.selenic.com/wiki/RebaseExtension#Configuration
56ka
1
@sschuberth Estoy de acuerdo. Mi solución consiste en volver a basar sus confirmaciones no ficticias en el elemento primario de la confirmación ficticia con la bandera --keepbranches, y luego eliminar hg en su confirmación ficticia. Es mucho trabajo cambiar el nombre de una sucursal, pero a veces Mercurial es así de tonto.
weberc2
30

Puede usar la extensión Mq . Digamos que los conjuntos de cambios para mover son las revisiones 1-3:

hg qimport -r 1:3    # convert revisions to patches
hg qpop -a           # remove all them from history
hg branch new        # start a new branch
hg qpush -a          # push them all back into history
hg qfin -a           # finalize the patches
Mark Tolonen
fuente
Quiero importar 63:64 y 66:68. Recibo la revisión 65 no es la madre de 64
Casebash
¿Qué quieres hacer con 65? Mq solo puede convertir conjuntos de cambios consecutivos de una cabeza. Convierte los conjuntos de cambios normalmente inmutables en parches mutables que se pueden editar. Esto cambia los hashes (que afectan a todos los niños), por lo que no puede omitir.
Mark Tolonen
Tengo una serie de cambios (incluyendo 65) que hice en la rama principal y
presioné
1
No edite conjuntos de cambios que hayan sido empujados. Mq cambia los hashes para que sean efectivamente nuevos conjuntos de cambios. Solo edite el historial que no se haya enviado.
Mark Tolonen
Si ya presionó 65, entonces definitivamente no debe mover 63 y 64, y simplemente conformarse con mover 66:68 (nuevamente, solo si no los ha presionado).
Matt
9

Prefiero la solución de parche descrita aquí por Mark Tolonen

Lo que tengo:

hg log -G

#default branch
@  changeset:   3:cb292fcdbde1
|
o  changeset:   2:e746dceba503
|
o  changeset:   1:2d50c7ab6b8f
|
o  changeset:   0:c22be856358b

Lo que quiero:

  @  changeset:   3:0e85ae268e35
  |  branch:      feature/my_feature
  |
  o  changeset:   2:1450cb9ec349
  |  branch:      feature/my_feature
  |
  o  changeset:   1:7b9836f25f28
  |  branch:      feature/my_feature
  |
 /
|
o  changeset:   0:c22be856358b

comandos mercuriales:

hg export -o feature.diff 1 2 3
hg update 0
hg branch feature/my_feature
hg import feature.diff

Aquí está el estado de mi repositorio local

@  changeset:   6:0e85ae268e35
|  branch:      feature/my_feature
|
o  changeset:   5:1450cb9ec349
|  branch:      feature/my_feature
|
o  changeset:   4:7b9836f25f28
|  branch:      feature/my_feature
|
| o  changeset:   3:cb292fcdbde1
| |
| o  changeset:   2:e746dceba503
| |
| o  changeset:   1:2d50c7ab6b8f
|/
|
o  changeset:   0:c22be856358b

Ahora necesito eliminar las revisiones 1 2 y 3 de mi rama predeterminada. Puede hacer esto con el comando strip de la extensión de mq. hg stripelimina el conjunto de cambios y todos sus descendientes del repositorio.

Habilite la extensión agregando las siguientes líneas a su archivo de configuración (.hgrc o Mercurial.ini):

vim ~/.hgrc y añadir :

[extensions]
mq =

Y ahora elimine este repositorio en la revisión 1.

hg strip 1

y aquí estamos

@  changeset:   3:0e85ae268e35
|  branch:      feature/my_feature
|
o  changeset:   2:1450cb9ec349
|  branch:      feature/my_feature
|
o  changeset:   1:7b9836f25f28
|  branch:      feature/my_feature
|
o  changeset:   0:c22be856358b

nota: los conjuntos de cambios son diferentes pero las revisiones son las mismas

Guillaume Vincent
fuente
5

Para aquellos inclinados a usar GUI

  1. Vaya a Tortoise Hg-> File-> Settingsluego marque rebase.

ingrese la descripción de la imagen aquí

  1. Reiniciar IU de tortuga

  2. Cree una nueva rama donde moverá los cambios. Haga clic en el nombre de la sucursal actual -> elija Open a new named branch-> elija el nombre de la sucursal.

ingrese la descripción de la imagen aquí

  1. Si no se han realizado los cambios que desea mover public(p draft. Ej. ) Vaya a 5. (Si los cambios ya se han publicado y usted no es un desarrollador senior, debe hablar con alguien mayor (obtener un chivo expiatorio) ya que podría arruinar las cosas a lo grande , No me hago responsable :)).

Vaya a View-> Show Console(o Ctrl+ L) y luego escriba en la consola hg phase -f -d 2- donde 2 es la revisión más baja, se mudará a una nueva rama.

  1. Vaya a rama y revisión (debería ser la revisión más alta si está moviendo cambios a una nueva rama creada en el paso 3.) Right Mouse->Update

  2. Vaya a la rama y revress, moverá los cambios de Right Mouse-> Modify History->Rebase

ingrese la descripción de la imagen aquí

  1. Haz clic Rebasey reza para que no haya conflictos, únete si es necesario.

  2. Empuje los cambios, en este punto todas las revisiones aún deberían ser draft.

  3. Vaya a la revisión superior en la rama a la que movía los cambios Right Mouse-> Change Phase to-> Public.

ingrese la descripción de la imagen aquí

Espero que esto te ahorre algo de tiempo.

Matas Vaitkevicius
fuente
¡Gran trabajo! voy a intentar esto, solo una pregunta: ¿por qué cambiar la fase a público al final? "Todos los conjuntos de cambios que se ven en un repositorio remoto son públicos", por lo tanto, cuando presionas, ¿no se establecerá en público de todos modos?
Joshua Duxbury
@JoshLeeDucks Al presionar ya no cambian a publicautomágicamente (al menos para mí no lo hacen).
Matas Vaitkevicius