Así que sigo cometiendo un error tonto en Mercurial. Muchas veces, empiezo a trabajar sin hacer un "hg pull" y una "actualización hg". Cuando trato de impulsar mis cambios, aparece un error.
¿Hay alguna forma de eliminar mis confirmaciones locales para evitar crear múltiples encabezados, ramas, etc.? Solo quiero eliminar mis confirmaciones locales, fusionar mis cambios con la sugerencia y luego volver a confirmar. Suena simple, ¿verdad? Parece que no puedo encontrar ninguna manera de eliminar fácilmente las confirmaciones locales, así que puedo fusionarme limpiamente con la sugerencia.
Una vez más, solo estoy tratando de eliminar las confirmaciones locales realizadas con "hg ci". No quiero modificar archivos, revertir, etc.
Respuestas:
Habilite la extensión " strip " y escriba lo siguiente:
¿Dónde
#changeset#
está el hash para el conjunto de cambios que desea eliminar? Esto eliminará dicho conjunto de cambios, incluidos los conjuntos de cambios que descienden de él, y dejará intacto su directorio de trabajo . Si desea revertir también los cambios de código comprometidos, elimine la--keep
opción.Para obtener más información, consulte la Extensión de la tira .
Si obtiene "comando desconocido" tira ", es posible que deba habilitarlo. Para hacerlo encontrar el
.hgrc
oMercurial.ini
archivo y añadir la siguiente a la misma:Tenga en cuenta que (como mencionó Juozas en su comentario) tener múltiples cabezas es un flujo de trabajo normal en Mercurial. No deberías usar el comando strip para luchar contra eso. En cambio, debe fusionar su cabeza con la cabeza entrante, resolver cualquier conflicto, probar y luego empujar.
El
strip
comando es útil cuando realmente desea deshacerse de los conjuntos de cambios que contaminan la rama. De hecho, si está en la situación de esta pregunta y desea eliminar por completo todos los conjuntos de cambios "borrador" de forma permanente, consulte la respuesta principal , que básicamente sugiere hacer:fuente
strip =
está bien. WhatsNew para Mercurial 2.8Si está utilizando Hg Tortoise, simplemente active la extensión " strip " en:
Luego seleccione la revisión inferior desde donde desea comenzar a dividir, haciendo
right click
en ella y seleccionando:Así como así:
En este ejemplo, se borrará de la 19a revisión a la última comprometida (22).
fuente
File/Settings/Extensions/
Desearía poder agregar más votos. ¡Muchas gracias!--keep
y TortoiseHg no da esa opción. Entonces ... necesitas hacerlo en la línea de comando conhg strip -r . --keep
.Respuesta moderna (solo relevante después de Mercurial 2.1):
Use Fases y marque las revisiones que no desea compartir como secretas (privadas). De esa manera, cuando empujes, no serán enviados.
En TortoiseHG puede hacer clic derecho en un compromiso para cambiar su fase.
Además: también puede usar la extensión "rebase" para mover sus confirmaciones locales al encabezado del repositorio compartido después de extraer.
fuente
Como todos los demás están señalando, probablemente solo debas tirar y luego fusionar las cabezas, pero si realmente quieres deshacerte de tus commits sin ninguna de las herramientas EditingHistory , entonces puedes simplemente
hg clone -r
tu repositorio para obtener todos menos esos cambios.Esto no los elimina del repositorio original, pero crea un nuevo clon que no los tiene. Luego, puede eliminar el repositorio que modificó (si lo desea).
fuente
Me encontré con este problema también. Hice 2
commit
y quería revertir y eliminar ambas confirmaciones.Pero
hg rollback
solo regresa a la última confirmación, no a las 2 confirmaciones. En ese momento no me di cuenta de esto y cambié el código.Cuando descubrí que
hg rollback
acababa de deshacer una confirmación, descubrí que podía usarhg strip #changeset#
. Entonces, solíahg log -l 10
encontrar los últimos 10 commits y obtener el conjunto de cambios correcto que queríastrip
.Que
abort: local changes found
significa Significa que sehg
encontraron cambios en el código que aún no se han confirmado. Entonces, para resolver esto, debehg diff
guardar el código que ha cambiado yhg revert
yhg strip #changeset#
. Así como así:Después de haber hecho lo anterior, puede
patch
el archivo diff y su código puede agregarse nuevamente a su proyecto.fuente
Puede solucionar esto aún más fácilmente con la extensión Rebase , solo use
hg pull --rebase
y sus confirmaciones se vuelven a comprometer automáticamente en la revisión extraída, evitando el problema de ramificación.fuente
Si está familiarizado con git, estará encantado de usar histedit que funciona de la misma manera
git rebase -i
.fuente
hg strip
es lo que buscas. Es análogo agit reset
si estás familiarizado con git.Use la consola:
Necesita saber el número de revisión.
hg log -l 10
. Este comando muestra los últimos 10 commits. Encuentra commit que estás buscando. Necesita un número de 4 dígitos de la línea de conjunto de cambioschangeset: 5888:ba6205914681
Entonces
hg strip -r 5888 --keep
. Esto elimina el registro de la confirmación pero mantiene todos los archivos modificados y luego puede volver a comprometerlos. (si desea eliminar archivos para simplemente eliminarlos --keephg strip -r 5888
fuente
[Hg Tortoise 4.6.1] Si se trata de una acción reciente, puede utilizar la acción "Deshacer / Deshacer" (Ctrl + U).
fuente
Además de la excelente respuesta de Samaursa, puede usar la
evolve
extensiónprune
como una versión segura y recuperablestrip
que le permitirá regresar en caso de que haga algo mal.Tengo este alias en mi
.hgrc
:Tenga en cuenta que
prune
también tiene--keep
, al igual questrip
, mantener el directorio de trabajo intacto, lo que le permite volver a comprometer los archivos.fuente