Elimine todos los conjuntos de cambios locales y vuelva al árbol
-
22-09-2019 - |
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.
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.