Pregunta

Estoy usando Mercurial y tengo un terrible desastre localmente, con tres cabezas. No puedo presionar, y solo quiero eliminar todos mis cambios locales y compromisos 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) ningún historial de ningún comodidad local.

lo sé hg update -C sobrescribe cualquier cambio local. Pero, ¿cómo elimino cualquier comodidad local?

Para ser claros, no tengo interés en preservar ninguno de los trabajos que he hecho localmente. Solo quiero la forma más simple de volver a un pago local totalmente limpio.

¿Fue útil?

Solución

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

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

Repetir hasta hg outgoing permanece en silencio. Tenga en cuenta que hg strip $rev borracho $rev y todos sus descendientes.

Tenga en cuenta que puede tener que Primero habilitar strip En tu configuración mercurial.

PD: Un enfoque aún más inteligente es usar el idioma revset, y hacer:

% hg strip 'roots(outgoing())'

Otros consejos

Querrá hacer un clon local donde preserve solo los conjuntos de cambios que también están presentes en el repositorio remoto. Usar Tortuga, hg log o similar para descubrir cuál de sus revisiones es la última revisión que no hacer (el que comenzara el desastre). Usando hg outgoing Puede ayudar aquí, enumerará todos los conjuntos de cambios que realizó, elija un número de revisión antes que cualquiera de ellos.

Si se llama a la revisión objetivo good y tu clon se llama foo, entonces hazlo:

hg clone -r good foo foo-clean

Esta será una operación rápida y local: hay No hay razón para descargar todo de nuevo. los foo-clean El clon solo contendrá conjuntos de cambios hasta la revisión good. Ahora puedes reemplazar foo-clean/.hg/hgrc con foo/.hg/hgrc Para preservar la configuración local de su repositorio, como la ruta Push/Pull Push predeterminada.

Cuando estás satisfecho de que foo-clean tiene todo lo que necesitas de foo, entonces simplemente borra foo y cambiar el nombre foo-clean a foo. Hacer un hg pull Para obtener nuevos conjuntos de cambios del repositorio remoto en su clon y continúe de manera normal.


Si nadie ha empujado nuevos conjuntos de cambios al repositorio remoto, entonces es muy simple determinar qué revisión desea usar como good arriba: hg id default le dirá la identificación de la punta en el repositorio remoto.

Está bien. Así que solo borra todas las cosas locales, hg init el nuevo repositorio local y hg pull El último consejo que tienes. No olvides hg update después de este.

Puedes utilizar

Revisión de Strip HG

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

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

Pero no intentes usarlo para cualquier cosa que ya haya sido empujado.

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

hg strip `hg out --template "{rev} {author}\n" | grep YOUR_AUTHOR_NAME | cut -d " " -f 1`

hace el truco para mí.

Dirige todas las revisiones que no están presionadas al repositorio predeterminado que se crean con el nombre de su autor.

También puede usar este estilo para no verificar con el repositorio predeterminado pero con otro repositorio

hg strip `hg out OTHER_REPO_ALIAS --template "{rev} {author}\n" | grep YOUR_AUTHOR_NAME | cut -d " " -f 1`

Si está utilizando TortoiseHG, una forma simple de salir de un desastre (pequeño) es actualizar primero a la última revisión, luego seleccione sus conjuntos de cambios e inicie "Fusionar With Local". Cuando aparezca el diálogo de fusiones, simplemente haga clic en el pequeño icono '+' para revelar algunas opciones adicionales, una de las cuales es "descartar los conjuntos de cambios de la revisión del objetivo de fusión (otro)". Hacer esto significará que sus conjuntos de cambios aún estarán 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 luego puede querer hacer referencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top