Eliminar todos los conjuntos de cambios locales y volver al árbol

95

Estoy usando Mercurial y me he metido en un lío terrible a nivel local, con tres cabezas. No puedo presionar, y solo quiero eliminar todos mis cambios y confirmaciones locales y comenzar de nuevo con un código totalmente limpio y un historial limpio.

En otras palabras, quiero terminar con (a) exactamente el mismo código localmente que existe en la punta de la rama remota y (b) sin historial de confirmaciones locales.

Sé que hg update -Csobrescribe los cambios locales. Pero, ¿cómo elimino las confirmaciones locales?

Para ser claros, no tengo ningún interés en preservar el trabajo que he realizado a nivel local. Solo quiero la forma más sencilla de volver a una caja local totalmente limpia.

Ricardo
fuente

Respuestas:

129

Cuando la forma más simple (una nueva hg clone) no es práctica, uso hg strip:

% hg outgoing -l 1
% hg strip $rev # replace $rev with the revision number from outgoing

Repita hasta que se hg outgoingquede quieto. Tenga en cuenta que hg strip $revborra $revy todos sus descendientes.

Tenga en cuenta que es posible que primerostrip deba habilitarlo en la configuración de Mercurial .

PD: un enfoque aún más inteligente es usar el lenguaje revset y hacer:

% hg strip 'roots(outgoing())'
solo alguien
fuente
1
¡Gracias! Terminé en una situación que esto se resolvió perfectamente, sin ningún problema.
Eswald
1
Esto me salvó de las grandes correcciones anteriores, muy simple, ¡gracias!
David C
3
Si alguien tiene problemas para hg strip 'roots(outgoing())'ir al trabajo debido a que no lo reconoce 'roots(outgoing())'. Pude hacer que funcionara hg strip "roots(outgoing())".
jsea
@SombreErmine cmd.exe, sí.
solo alguien
21

Querrá hacer un clon local en el que conserve solo los conjuntos de cambios que también están presentes en el repositorio remoto. Use TortoiseHg , hg logo similar para averiguar cuál de sus revisiones es la última revisión que no hizo (la anterior a que comenzara el desorden). Utilizandohg outgoing puede ayudar aquí, enumerará todos los conjuntos de cambios que realizó, elija un número de revisión anterior a cualquiera de esos.

Si se llama a la revisión de destino y se llama a goodsu clon foo, haga lo siguiente:

hg clone -r good foo foo-clean

Esta será una operación local rápida; no hay razón para descargar todo de nuevo . El foo-cleanclon solo contendrá conjuntos de cambios hasta la revisión good. Ahora puede reemplazar foo-clean/.hg/hgrccon foo/.hg/hgrcpara preservar la configuración local del repositorio, como la ruta push / pull predeterminada.

Cuando esté satisfecho de que foo-cleantiene todo lo que necesita foo, simplemente elimine fooy cambie el nombre foo-cleana foo. Haga una hg pullpara obtener nuevos conjuntos de cambios del repositorio remoto en su clon y continúe como de costumbre.


Si nadie ha enviado nuevos conjuntos de cambios al repositorio remoto, entonces es muy simple determinar qué revisión desea usar como se indica goodarriba: hg id defaultle dirá el ID de la sugerencia en el repositorio remoto.

Martin Geisler
fuente
Tengo la misma situación, pero también tengo muchos archivos en el directorio de repositorios, pero están en hgignore. No se puede instalar hg strip y me gustaría eliminar las confirmaciones locales sin reemplazar todo el clon. ¿Algunas ideas? - ¡Ah! Si no he agregado ningún archivo, ¿¡debería poder copiar el otro clon en mi directorio anterior !?
Peteter
Sin embargo, tenga cuidado con este método si tiene varias ramas. La clonación hasta una revisión especificada solo obtiene los conjuntos de cambios en la rama de la revisión especificada. Puede que tenga que hacerlo hg pull -rpara la última revisión "buena" de cada rama adicional.
Yitz
9

Okay. Así que simplemente elimine todo el material local, hg initel nuevo repositorio local y hg pullel último consejo que tenga. No te olvides dehg update después de esto.

Alemjerus
fuente
Gracias. Cuando dices 'eliminar todas las cosas locales', ¿te refieres a eliminar todo el repositorio o solo mis cambios? ¿Qué hace hg init (busqué en Google pero no puedo ver una explicación simple) y necesito usar algún indicador con él? ¿Eliminará cosas como mis preferencias .hgrc de Mercurial?
Richard
Actualización: si elimino todo en el directorio raíz del proyecto, luego escribo 'hg init', obtengo 'abort: repository. ¡ya existe!'. ¿Necesito configurar y trabajar desde un nuevo directorio? Preferiría no hacerlo si fuera posible ... ¡¿seguramente debe haber una forma sencilla de acabar con todo lo que he hecho localmente ?!
Richard
Sí, elimine todo, incluidas todas las cosas del repositorio. Comience desde una nueva carpeta limpia. Puede guardar sus preferencias en un archivo de respaldo y luego restaurarlas en el nuevo repositorio que crea con hg init reponame. Detalles sobre init y esas cosas: hgbook.red-bean.com/read/mercurial-in-daily-use.html
alemjerus
6
alemjerus: hg init+ hg pull= hg cloneLa diferencia es que hg clonehace un buen .hg/hgrcarchivo para usted y hg cloneusará enlaces duros para ahorrar espacio al clonar en el mismo sistema de archivos.
Martin Geisler
Richard: La salida de hg help initestá aquí: selenic.com/mercurial/hg.1.html#init ¿ Pero quizás eso es demasiado conciso? Envíe un correo a nuestra lista de correo si necesita más ayuda. Ver: mercurial.selenic.com/wiki/MailingLists
Martin Geisler
5

Puedes utilizar

revisión de la tira de hg

para matar cualquier revisión y su subárbol en su repositorio local.

https://www.mercurial-scm.org/wiki/Strip

Pero no intente usarlo para nada que ya haya sido promocionado.

averasko
fuente
Puede usarlo en una revisión pública, pero si vuelve a tirar, volverá a aparecer. (hg strip solo funciona con el repositorio local).
Mike Rosoft
2

Simplemente elimine todo lo que tenga en su sistema local y vuelva a clonar el repositorio remoto.

DO.
fuente
2
hg strip `hg out --template" {rev} {autor} \ n "| grep YOUR_AUTHOR_NAME | cortar -d "" -f 1`

hace el truco por mí.

Elimina todas las revisiones que no se envían al repositorio predeterminado que se crean con su nombre de autor.

También puede utilizar este estilo para que no se verifique con el repositorio predeterminado sino con otro repositorio.

hg strip `hg out OTHER_REPO_ALIAS --template" {rev} {autor} \ n "| grep YOUR_AUTHOR_NAME | cortar -d "" -f 1`
Sebastián
fuente
0

Si está utilizando TortoiseHg, una forma sencilla de salir de un (pequeño) lío es actualizar primero a la última revisión, luego seleccionar sus conjuntos de cambios e iniciar "fusionar con local". Cuando aparezca el diálogo de combinación, simplemente haga clic en el pequeño icono '+' para revelar algunas opciones adicionales, una de las cuales es "descartar conjuntos de cambios de la revisión de destino de combinación (otra)". Hacer esto significará que sus conjuntos de cambios seguirán estando en el repositorio y serán empujados, pero no tendrán ningún efecto, porque se descartarán en la fusión. Si tiene muchos conjuntos de cambios que abarcan muchas cabezas, es posible que no desee contaminar el repositorio de esta manera, pero es una solución simple y vale la pena considerar si los conjuntos de cambios que está descartando contienen datos a los que más adelante querrá hacer referencia.

MrFlamey
fuente