2010-11-16 11 views
32

Mi pregunta es la siguiente:¿Cómo fusionarse para deshacerse de la cabeza con la línea de comandos de Mercurial, como puedo hacer con TortoiseHg?

  • Si tengo dos cabezas (ramas con cambios) en mi repositorio Mercurial, y me gustaría deshacerse de uno de ellos, pero descartar todos los cambios de esa rama en vez de fusionarlos en el otro, y no puedo quitar esos conjuntos de cambios, así que tengo que fusionarme, ¿cómo puedo hacer eso con el cliente de la línea de comandos?

Si tengo dos cabezas en mi repositorio Mercurial, y el uso de TortoiseHg como mi cliente, el repositorio podría tener este aspecto:

two heads

Entonces puede deshacerse de la test2 Dirígete haciendo una fusión y descartando. Primero actualizaría al encabezado que me gustaría conservar (test3 en este caso, que en la imagen anterior ya es el padre actual de mi carpeta de trabajo). Entonces me gustaría hacer clic derecho y seleccionar "Combinar con ...":

merge with...

y en el diálogo que aparece, yo elegiría para descartar los cambios con respecto al objetivo de combinación (es decir, la rama I'. d como para descartar todos los cambios desde):

merge dialog

Después de esta fusión ha tenido que pasar, todos los cambios en la cabeza test2 ha sido descartada, y pueden cometer. La cabeza ahora ha desaparecido, pero el conjunto de cambios sigue siendo parte de la historia.

Mi pregunta es esta: ¿Cómo puedo hacer lo mismo usando solo el cliente de línea de comando? No puedo encontrar ningún opciones de concordancia a la orden hg merge:

 
hg merge [-P] [-f] [[-r] REV] 

merge working directory with another revision 

... snipped text 

options: 

-f --force  force a merge with outstanding changes 
-t --tool VALUE specify merge tool 
-r --rev REV  revision to merge 
-P --preview  review revisions to merge (no merge is performed) 
    --mq   operate on patch repository 

use "hg -v help merge" to show global options 

Editar: debugsetparents trabajaron muy bien:

 
hg debugsetparents . 1 
hg commit -m "merged to get rid of changeset #1" 

Editar: intenta utilizar el --tool internal:local acuerdo a una de las respuestas:

@echo off 

setlocal 
if exist repo rd /s /q repo 
hg init repo 
cd repo 

rem revision 0 
echo >test1.txt 
hg commit -m "test1" --addremove 

rem revision 1 
echo >test2.txt 
hg commit -m "test2" --addremove 

rem revision 2 
hg update 0 
echo >test3.txt 
hg commit -m "test3" --addremove 

rem now let's get rid of change in revision 1 with merge 
hg merge --tool internal:local -r 1 
hg commit -m "merged" 

dir 

salida de ejecución:

 
[C:\Temp] :test 
adding test1.txt 
adding test2.txt 
0 files updated, 0 files merged, 1 files removed, 0 files unresolved 
adding test3.txt 
created new head 
1 files updated, 0 files merged, 0 files removed, 0 files unresolved 
(branch merge, don't forget to commit) 

Volume in drive C is unlabeled  Serial number is 0e17:6aba 
Directory of C:\Temp\repo\* 

16.11.2010 20:05    . 
16.11.2010 20:05    .. 
16.11.2010 20:05    .hg 
16.11.2010 20:05    13 test1.txt 
16.11.2010 20:05    13 test2.txt 
16.11.2010 20:05    13 test3.txt 
       39 bytes in 3 files and 3 dirs 12 288 bytes allocated 
    66 600 316 928 bytes free 

Aquí los cambios introducidos en el segundo conjunto de cambios (el uno con el número de revisión 1), está presente en el conjunto de cambios fusionada. Esto no es lo que yo quería.

Respuesta

28

Según TortoiseHG de source, cuando se echa un Discard all changes from merge target (other) revision, se utiliza el comando hg debugsetparents:

hg debugsetparents REV1 [REV2] 

manually set the parents of the current working directory 

    This is useful for writing repository conversion tools, but should be used with care. 

    Returns 0 on success. 

use "hg -v help debugsetparents" to show global options 

de usar:

hg up <revision-to-keep> 
    hg debugsetparents <revision-to-keep> <revision-to-throw-away> 
    hg commit -m "Merge to discard ..." 
+1

'hg debugsetparents. REV2' seguido de 'hg merge' funcionó bien, gracias. –

+0

Muy útil para un desarrollador de iOS que tenemos usando MacHG que no admite la función "Descartar todos los cambios de la fusión de objetivo (otra) revisión". –

+9

Solo por mi propia referencia (ya que a menudo vuelvo aquí, tratando de recordar esto): uno quiere ejecutar 'hg debugsetparents '. Esto puede deducirse de los documentos de ayuda pero no es exactamente * obvio *. –

2

actualización de su directorio de trabajo a la revisión que desea mantener , entonces:

hg merge --tool internal:local -r REVISION_TO_DISCARD 

Véase el Mercurial tips and tricks alguna información un poco fuera de fecha: la --config ui.merge ahora se proporciona mediante la opción --tool a hg merge (que se introdujo en la versión 1.7)

+2

Eso no parece funcionar, permítame editar mi pregunta para mostrar lo que hice de acuerdo con su respuesta aquí. –

+0

@ LasseV.Karlsen ¿podemos sacar mercurial DVCS con autorización usando mercurial.net? Estoy usando mercurial.net y publiqué una pregunta, ¿podría ayudarme, por favor? – Sandepku

+0

Cualquier cosa que pueda hacer en la línea de comandos que puede hacer con mercurial.net, pero si necesita responder a una pregunta sobre nombre de usuario y/o contraseña, puede ser más difícil de hacer. Ha pasado un tiempo desde que utilicé mercurial desde que cambié a Git, así que no estoy del todo seguro. –

1

Si no desea utilizar debugsetparents, puede volver manualmente al conjunto de cambios que desea conservar antes de comprometerse:

hg merge --tool internal:local -r HEAD_YOU_WANT_TO_DISCARD 
hg revert -r 'tip^' 
hg commit 

Nótese, sin embargo, que esta técnica no es necesariamente el mejor enfoque. Puede ser mejor que solo cierre la cabeza:

hg up HEAD_YOU_WANT_TO_DISCARD 
hg commit --close-branch 

La documentación aquí es un poco engañosa; esto solo cierra la cabeza específica, no toda la rama.

+0

'tip ^' no funcionó para mí, pero especificó 'branch_to_keep' en su lugar. También puede revertir el archivo por archivo, en caso de que haya algunos que desee conservar. – murrayju

Cuestiones relacionadas