Tengo una serie de cambios que comprometí en mi repositorio local, pero aún no se han enviado. Dado que una función tarda más de lo esperado, quiero intercambiar estos cambios en una rama con nombre antes de presionar. ¿Cómo puedo hacer esto?
Tengo una serie de cambios que comprometí en mi repositorio local, pero aún no se han enviado. Dado que una función tarda más de lo esperado, quiero intercambiar estos cambios en una rama con nombre antes de presionar. ¿Cómo puedo hacer esto?
Respuestas:
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 0
es la base sobre la que comenzó a trabajar en su función. Ahora quiere tener revisiones 1-2
en una rama con nombre, digamos my-feature
. Actualice a revisión 0
y 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 rebase
comando para mover las revisiones 1-2
a 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.
fold
comando de la extensión histedit ahora incorporada ).
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 .
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
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 strip
elimina 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
Para aquellos inclinados a usar GUI
Tortoise Hg
-> File
-> Settings
luego marque rebase
.Reiniciar IU de tortuga
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.
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.
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
Vaya a la rama y revress, moverá los cambios de Right Mouse
-> Modify History
->Rebase
Haz clic Rebase
y reza para que no haya conflictos, únete si es necesario.
Empuje los cambios, en este punto todas las revisiones aún deberían ser draft
.
Vaya a la revisión superior en la rama a la que movía los cambios Right Mouse
-> Change Phase to
-> Public
.
Espero que esto te ahorre algo de tiempo.
public
automágicamente (al menos para mí no lo hacen).