2010-02-26 33 views
166

Así que sigo cometiendo un error tonto en Mercurial. Muchas veces, voy a empezar a trabajar sin hacer un "hg pull" y una "actualización de hg". Cuando intento presionar mis cambios, aparece un error.¿Hay alguna forma de eliminar confirmaciones locales en Mercurial?

¿Hay alguna manera de eliminar mi confirmaciones locales así que puedo evitar crear varias cabezas, ramas, etc.? Solo quiero eliminar mis confirmaciones locales, fusionar mis cambios con la sugerencia y luego volver a comprometerme. Suena simple, ¿verdad? Parece que no puedo encontrar ninguna forma de eliminar fácilmente local commits para que pueda fusionarme con la punta.

De nuevo, solo estoy tratando de eliminar confirmaciones locales hechas con "hg ci". No quiero modificar archivos, revertir, etc.

+0

posible duplicado http://stackoverflow.com/questions/2139165/mercurial-delete-all-local-changesets-revert-to-tree –

+7

No es un error tonto, es un flujo de trabajo normal cuando varias personas trabajan con el mismo repositorio simultáneamente. –

Respuesta

8

Puede evitar esto aún más fácilmente con Rebase extension, simplemente use hg pull --rebase y sus confirmaciones se vuelven a realizar automáticamente en la revisión extraída, evitando el problema de bifurcación.

+1

A expensas de tener un historial impreciso y posible corrupción si hace las cosas incorrectamente. –

12

Como todos los demás señalan, es probable que solo tengas que tirar y fusionar las cabezas, pero si realmente quieres deshacerte de tus commits sin ninguna de las herramientas EditingHistory, entonces puedes obtener hg clone -r de tu Repo para obtener todas menos las cambios.

+0

¿"hg clone -r" elimina los cambios locales? ? Solo quiero eliminar compromisos locales para mantener las cosas simples. – user191535

+3

No los elimina del repositorio clonado, pero crea un nuevo clon que no los tiene. Luego puede eliminar el repositorio que modificó si lo hubiera hecho como. –

196

habilitar la extensión "mq" y escriba lo siguiente:

hg strip #changeset# 

Dónde #changeset# es el hash para el conjunto de cambios que desea eliminar. Esto eliminará dicho conjunto de cambios incluyendo conjuntos de cambios que descienden de él.

Para obtener más información, consulte el Strip Extension.

Si obtiene "comando desconocido" tira "" puede necesitar habilitarlo. Para hacerlo encontrar el archivo o .hgrcMercurial.ini y agregue el siguiente a la misma:

[extensions] 
mq = 

Tenga en cuenta que (como Juozas mencionó en su comentario) que tiene múltiples cabezas es el flujo de trabajo normal en el mercurial. No deberías usar el comando strip para combatir eso. En su lugar, debe fusionar su cabeza con la cabeza entrante, resolver cualquier conflicto, probar y luego presionar.

El comando strip es útil cuando realmente desea deshacerse de los conjuntos de cambios que contaminan la rama. De hecho, si se encuentra en situación this question 's y quiere elimine por completo la 'borrador' cambio fija de forma permanente, echa un vistazo a the top answer, que básicamente se sugiere hacer:

hg strip 'roots(outgoing())' 
+2

no hay ningún comando de tira disponible – BHS

+7

@Bharath: Necesita habilitar la extensión – Samaursa

+3

@samaursa ¿Y cómo lo hace? El enlace que proporciona a la extensión de la tira conduce a una página wiki no existente. – Nilzor

13

respuesta moderna (relevante sólo después de Mercurial 2.1):

Use Phases y marque la (s) revisión (es) que no desea compartir como secretas (privadas). De esa forma, cuando presionas, no serán enviados.

En TortoiseHG puede hacer clic derecho en un compromiso para cambiar su fase.

También: También puede usar la extensión "rebase" para mover sus confirmaciones locales al encabezado del repositorio compartido después de tirar.

+0

Privado == secreto ahora –

5

Si está familiarizado con git, con gusto utilizará histedit que funciona como git rebase -i.

67

Si está utilizando Hg tortuga simplemente activar la extensión "mq" en:

  1. Archivo/Configuración/Extensiones/
  2. Seleccionar mq

A continuación, seleccione la revisión inferior desde donde desea comenzar a hacer striping, haciendo right click sobre ella, y seleccionando:

  1. Modificar la historia
  2. Gaza

Al igual que este:

enter image description here

En este ejemplo se va a borrar de la 19ª revisión a la última comprometida (22).

+1

'Archivo/Configuraciones/Extensiones/"Me gustaría poder agregar más votos. ¡Muchas gracias! – dyatchenko

+0

Argh! Intenté esto pero pareció descargar todos mis cambios a pesar de no marcar "sin copia de seguridad" o "descartar cambios locales". Quería mantener esos cambios, ¡simplemente no los cometí! ¿Hay alguna manera de recuperarlos ahora? –

+2

Parece que no puedo encontrar la forma de hacerlo correctamente, pero parece que se debe mantener el contenido que necesita para pasar '--keep' y TortoiseHg no da esa opción. Entonces ... debes hacerlo en la línea de comando con 'hg strip -r. --keep'. –

8

Me encontré con este problema también. Hice 2 commit y quería deshacer y eliminar ambas confirmaciones.

$ hg rollback 

Pero hg rollback simplemente deshace la última confirmación, no los 2 confirmaciones. En ese momento no me di cuenta de esto y cambié el código.

Cuando encontré que hg rollback acababa de retrotraer una confirmación, descubrí que podía usar hg strip #changeset#. Entonces, utilicé hg log -l 10 para encontrar los últimos 10 commits y obtener el conjunto de cambios correcto que quería strip.

$ hg log -l 10 
changeset: 2499:81a7a8f7a5cd 
branch:  component_engine 
tag:   tip 
user:  myname<[email protected]> 
date:  Fri Aug 14 12:22:02 2015 +0800 
summary:  get runs from sandbox 

changeset: 2498:9e3e1de76127 
branch:  component_engine 
user:  other_user_name<[email protected]> 
date:  Mon Aug 03 09:50:18 2015 +0800 
summary:  Set current destination to a copy incoming exchange 

...... 

$ hg strip 2499 
abort: local changes found 

¿Qué significa abort: local changes found? Significa que hg encontró cambios en el código que aún no se han confirmado. Por lo tanto, para resolver esto, debe hg diff guardar el código que ha cambiado y hg revert y hg strip #changeset#. Al igual que este:

$ hg diff > /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff 
$ hg revert file_you_have_changed 
$ hg strip #changeset# 

Después de haber hecho lo anterior, se puede patch el archivo diff y su código se puede agregar de nuevo a su proyecto.

$ patch -p1 < /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff 
1

hg strip es lo que estás buscando. Es análogo de git reset si está familiarizado con git.

Uso de la consola:

  1. Usted necesita saber el número de revisión. hg log -l 10. Este comando muestra los últimos 10 commits. Encuentra la confirmación que estás buscando.Necesita un número de 4 dígitos de la línea del conjunto de cambios changeset: 5888:ba6205914681

  2. Luego 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 los archivos a eliminar sólo --keep hg strip -r 5888

Cuestiones relacionadas