2010-06-03 33 views
19

(Soy un recién llegado relativo a TortoiseHg, así que tengan paciencia conmigo :-) Uso TortoiseHg en dos máquinas para hablar con mi repositorio fuente remoto. Hice cambios en una máquina, los comprometí e intenté llevarlos al repositorio remoto PERO olvidé primero hacer una extracción para obtener primero el código más reciente. El impulso me dio algunas líneas de salida, sugiriendo que puede haber olvidado tirar primero (¡cierto!) Y mencioné algo así como "abortar: el empuje crea nuevas ramas remotas ...".¿Cómo eliminar una rama accidental en TortoiseHg?

Así que hice un tirón, que agregó varios nodos a la cabeza de mi gráfico en el explorador de repositorio. El problema es que el impulso que traté de hacer ahora se muestra como una rama en el explorador del repositorio. Mirando desde el lado del servidor (codeplex), no muestra signos de mi intento de inserción, lo que indica que esta rama accidental todavía es local en mi máquina.

¿Cómo podría eliminar esta rama accidental? Intenté seleccionar ese nodo en el gráfico y luego "revertir", pero no pareció hacer nada. Me pregunto si sería más simple descartar mi árbol de directorios en mi máquina local y hacer una extracción completamente nueva y limpia del servidor ...

Respuesta

17

Primero asegúrese de haber realizado todos los cambios locales. A continuación, combine las ramas llamando al hg merge y confirme el resultado.

Esto debería llevarlo de regreso a una sola rama, reuniendo las dos cabezas.

+7

Parece que la rama todavía estará allí, ¿sí? Espero eliminar completamente la rama, ya que aún no la he hecho permanente en el servidor. –

+0

@msorens: Los dos conjuntos de cambios que se cometieron "en paralelo" seguirán siendo así, pero ¿es importante? Con la combinación, las dos ramas se unirán en una sola revisión superior. A partir de ese momento, volverá a haber una sola revisión más reciente, aunque tenga una breve bifurcación en dos ramas en sus predecesores. – sth

+3

@msorens: estoy de acuerdo con sth. Después de un tiempo usando Mercurial, te das cuenta de que tratar de mantener el historial de revisión tan limpio no merece la pena. No importa que los conjuntos de cambios estén fuera de secuencia entre su servidor y sus repositorios locales o que tenga una sucursal anónima de corta vida (ambos son esperados si tiene más de una persona trabajando en un proyecto).) –

2

En el Explorador de repositorios, elija la primera modificación de sus cambios locales, luego haga clic derecho en la rama que acaba de sacar y seleccione "Rebase sobre seleccionado" o "Modificar historial-> Rebase sobre seleccionado "Dependiendo de la versión de su cliente. Esto "volverá a basar" tus revoluciones en los tirados.

Además, para ayudar a evitar que en el futuro ...

En Explorador de repositorio, seleccione Herramientas-> Configuración. En el menú desplegable de la esquina superior izquierda, seleccione "Configuración global del usuario", por lo que esto se aplica a todos los repositorios. Luego elija Sincronizar a la izquierda. En "Operación After Pull", seleccione "rebase". Esto hará que sus revisiones locales sean "reajustadas" sobre las revisiones que acaba de sacar, en lugar de dejarlas en una rama diferente.

Así es como lo hago y es probablemente lo que generalmente desea. Para obtener más información, consulte rebase project y rebase extension.

+0

[Estoy dividiendo esto en 2 comentarios debido a las restricciones SO.] Me gusta la noción de esto. Solo un par de cosas: primero, no hay tal opción en mi menú contextual. La página RebaseExtension proporcionó la respuesta: habilítela poniendo un par de líneas en el archivo de configuración, que se puede encontrar consultando la sección 5 del manual de Mercurial. Lo hice y luego ejecuté una rebase: ¡se quejaba de los tipos de archivos no compatibles para dos archivos que terminaban en .orig que fueron creados por la operación de rebase en sí! Luego indicó que se canceló para poder solucionar los conflictos, y dijo que ejecutara "hg rebase --continuar" cuando terminara ... –

+0

[Parte 2 de mi comentario dividido] Pero como estoy ejecutando en TortoiseHg no es la línea de cmd, no seguro de cómo haría la operación "rebase - continue" ... Por último, la confirmación dice, en mi caso, "rebase 14 encima de 6?". Eso me parece retrógrado: 14 es la rama principal tirada; 6 es mi sucursal local. –

+0

@msorens re: Menú contextual - Es un poco incómodo. Primero debe elegir una revolución haciendo clic izquierdo, haciendo que se resalte. Luego, elija la siguiente haciendo clic con el botón derecho, que luego mostrará las dos revoluciones resaltadas y le dará la opción de rebase. Si no aparece para ti, suena como quizás otra pregunta. –

5

Haga una "Fusionar con" y marque "Descartar todos los cambios de la revisión del objetivo de fusión (otra)". Por supuesto, debes asegurarte de que el objetivo que se muestra como el objetivo de combinación sea realmente el que deseas descartar antes de hacer clic en el botón Fusionar.

+1

Esto descartaría las ediciones del cuestionario, lo que no creo que fuera la intención de la pregunta. –

+1

eso es lo que pensé, pero mira las referencias del código de revisión, el descarte se hace al que seleccionas para fusionarte –

6

Tenía una sucursal que no quería, pero encontré que no podía fusionar la sucursal (o fue muy difícil para mí descubrir cómo fusionarla) porque contenía un conflicto basado en un cambio de nombre de archivo.

En última instancia, decidí hg commit --close-branch. Dado que la sucursal había existido solo en mi repositorio local, y no en el repositorio desde el que había clonado, el siguiente hg push ni siquiera se molestó en enviar la rama cerrada al repositorio maestro. Muy conveniente. En ese momento, todo lo que tuve que hacer para eliminarlo por completo fue eliminar mi repositorio local y volver a clonarlo desde el "maestro".

0

Así es como hacerlo con la herramienta de línea de comandos. Supongo que se puede asignar fácilmente a TortoiseHg (aunque no estoy seguro, ya que nunca lo uso ...) De todos modos, como debería hacerse solo de vez en cuando, creo que no hay ningún problema en usar la terminal aquí. .

Un ejemplo de configuración de

Suponga que su repositorio remoto es algo como esto:

@ changeset: 3:a4c18a1fba12 
| tag:   tip 
| summary:  commit 4 
| 
o changeset: 2:91c5dbfba15c 
| summary:  commit 3 
| 
o changeset: 1:4c77cb7952ea 
| summary:  commit 2 
| 
o changeset: 0:085dae46f27e 
    summary:  commit 1 

A nivel local, que no tenía comprometerse 4, por lo que cometió algo directamente sobre cometen 3:

@ changeset: 3:39526003350f 
| tag:   tip 
| summary:  commit 4 made locally 
| 
o changeset: 2:91c5dbfba15c 
| summary:  commit 3 
| 
o changeset: 1:4c77cb7952ea 
| summary:  commit 2 
| 
o changeset: 0:085dae46f27e 
    summary:  commit 1 

Así que intenta presionarlo y recibe este mensaje:

$ hg push 
pushing to ssh://[email protected]/brandizzi/mercurial-test-repo 
searching for changes 
remote has heads on branch 'default' that are not known locally: a4c18a1fba12 
abort: push creates new remote head 39526003350f! 
(pull and merge or see "hg help push" for details about pushing new heads) 

Conforme a lo solicitado, se tire de ella:

$ hg pull 
pulling from ssh://[email protected]/brandizzi/mercurial-test-repo 
searching for changes 
adding changesets 
adding manifests 
adding file changes 
added 1 changesets with 1 changes to 1 files (+1 heads) 
(run 'hg heads' to see heads, 'hg merge' to merge) 

lo tienes ahora ...

o changeset: 4:a4c18a1fba12 
| summary:  commit 4 
| 
| @ changeset: 3:39526003350f 
|/ summary:  commit 4 made locally 
| 
o changeset: 2:91c5dbfba15c 
| summary:  commit 3 
| 
o changeset: 1:4c77cb7952ea 
| summary:  commit 2 
| 
o changeset: 0:085dae46f27e 
    summary:  commit 1 

... pero prefiere no combinar lo solicitado. Desea tener esto en su lugar:

o changeset: 4:a4c18a1fba12 
| summary:  commit 4 made locally 
| 
o changeset: 3:a4c18a1fba12 
| summary:  commit 4 
| 
o changeset: 2:91c5dbfba15c 
| summary:  commit 3 
| 
o changeset: 1:4c77cb7952ea 
| summary:  commit 2 
| 
o changeset: 0:085dae46f27e 
    summary:  commit 1 

Y luego desea empujarlo al repositorio remoto.

¿Cómo lo logras?

Resolverlo

Para conseguir eso, usted no puede han empujado el "commit 4 han añadido a nivel local". Además, no hay forma de ponerlo después de el nuevo control remoto confirma. Dicho eso, podemos obtener lo que pedimos.

Dicho esto, sólo tiene que reajustar confirmar sus locales en el nuevo mando a distancia de comprometerse:

$ hg rebase --source 3 --dest 4 

Si tiene suerte, eso será suficiente.

la gestión de conflictos

Si tienes la mala suerte, es posible que tenga algunos conflictos:

$ hg rebase --source 3 --dest 4 
rebasing 3:39526003350f "commit 4 made locally" 
merging test.txt 
warning: conflicts while merging test.txt! (edit, then use 'hg resolve --mark') 
unresolved conflicts (see hg resolve, then hg rebase --continue) 

Luego, sólo resolver los conflictos (editando manualmente):

$ hg st 
M test.txt 
$ nano test.txt # Edit and save 

.. .marque el archivo como resuelto ...

$ hg resolve --mark 
(no more unresolved files) 
continue: hg rebase --continue 

... y proceder con el rebase:

$ hg rebase --continue 
rebasing 3:39526003350f "commit 4 made locally" 
saved backup bundle to /home/adam/software/mercurial-test-repo/.hg/strip-backup/39526003350f-64863882-backup.hg 

Aquí es su nueva historia:

@ changeset: 4:ca31fe8a15f0 
| summary:  commit 4 made locally 
| 
o changeset: 3:a4c18a1fba12 
| summary:  commit 4 
| 
o changeset: 2:91c5dbfba15c 
| summary:  commit 3 
| 
o changeset: 1:4c77cb7952ea 
| summary:  commit 2 
| 
o changeset: 0:085dae46f27e 
    summary:  commit 1 

Ahora, empujarlo:

$ hg push 
pushing to ssh://[email protected]/brandizzi/mercurial-test-repo 
searching for changes 
remote: adding changesets 
remote: adding manifests 
remote: adding file changes 
remote: added 1 changesets with 1 changes to 1 files 

Esos días, no es tan complejo como solía ser, ¿verdad?:)