¿Cómo fusionarse para deshacerse de la cabeza con la línea de comandos de Mercurial, como puedo hacer con TortoiseHg?
merge branch (2)
De acuerdo con la source de TortoiseHG, cuando selecciona Discard all changes from merge target (other) revision
, 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
Usar:
hg up <revision-to-keep>
hg debugsetparents <revision-to-keep> <revision-to-throw-away>
hg commit -m "Merge to discard ..."
Mi pregunta es esta:
- Si tengo dos cabezas (ramas con cambios) en mi repositorio de Mercurial, y me gustaría deshacerme de una de ellas, descarto todos los cambios de esa rama en lugar de fusionarlos en la otra, y no puedo desnudarme fuera de esos conjuntos de cambios, así que tengo que fusionarme, ¿cómo puedo hacer eso con el cliente de línea de comando?
Si tengo dos cabezas en mi repositorio de Mercurial y uso TortoiseHg como mi cliente, el repositorio podría verse así:
Entonces puedo deshacerme de la cabeza de test2
haciendo una fusión y descartando. Primero actualizaría al jefe que me gustaría conservar ( test3
en este caso, que en la imagen de arriba ya es el padre actual de mi carpeta de trabajo). Luego hago clic derecho y selecciono "Fusionar con ...":
y en el cuadro de diálogo que aparece elegiría descartar los cambios del objetivo de fusión (es decir, la rama de la que me gustaría descartar todos los cambios):
Después de esta fusión, todos los cambios en el cabezal de test2
se han descartado y puedo confirmar. 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 ninguna opción coincidente con el comando 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 funcionó bien:
hg debugsetparents . 1 hg commit -m "merged to get rid of changeset #1"
Editar : intente utilizar el --tool internal:local
según 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 que tiene el número de revisión 1) ahora están presentes en el conjunto de cambios fusionado. Esto no es lo que yo quería.
Si no desea utilizar los debugsetparents
, puede volver manualmente al conjunto de cambios que desea conservar antes de realizar:
hg merge --tool internal:local -r HEAD_YOU_WANT_TO_DISCARD
hg revert -r ''tip^''
hg commit
Tenga en cuenta, 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.