2010-04-20 17 views
58

Soy un usuario de Git que intenta usar Mercurial.¿Cómo reinicio git --hard HEAD en Mercurial?

Esto es lo que sucedió: Hice un hg backout en un conjunto de cambios que quería revertir. Eso creó una nueva cabeza, por lo que hg me indicó que me fusionara (de nuevo a "predeterminado", supongo). Después de la fusión, me dijo que todavía tenía que comprometerme. Luego noté algo que hice mal al resolver un conflicto en la fusión, y decidí que quería tener todo como antes del hg backout, es decir, quiero que esta fusión sin compromiso desaparezca. En Git, estas cosas sin compromiso estarían en el índice y solo haría un git reset --hard HEAD para eliminarlo, pero, por lo que he leído, el índice no existe en Mercurial. Entonces, ¿cómo me alejo de esto?

+0

posible duplicado de (http: // stackoverflow. com/questions/4172753/how-to-get-rid-of-some-changeset-in-hg) – binki

Respuesta

76

Si todavía no has comprometidos, y suena como usted no ha puede deshacer todo el trabajo de combinación con hg update --clean.

Sin embargo, en mercurial's más recientes hay un comando útil para volver a combinar un solo archivo: hg resolve path/to/file.ext. Desde el hg help resolve:

The available actions are: ... 

4) discard your current attempt(s) at resolving conflicts and 

reinicio la fusión a partir de cero: "archivo hg determinación ..." (o "-a" para todos los archivos sin resolver )

+0

Lo siento, todavía estoy un poco confundido: ejecuté 'hg up -C', pero la confirmación de" retroceso "todavía está en la punta de mi rama. Pensé que esta era una "rama fantasma" que se creó con el 'retroceso', pero que ejecuta' hg branch' devuelve 'default', ¿entonces estoy en la rama principal después de todo? – hsribei

+3

Puedes tener dos cabezas con la misma rama, y ​​eso es lo que tienes. Ambos son nombrados 'default'. Esta es una situación muy normal en mercurial y ' 'hg heads' es el comando que usa para descubrirlo. Cuando ejecutaste 'hg backout'," Confirma los cambios retirados como un nuevo conjunto de cambios ", por lo que creó un nuevo conjunto de cambios que no desaparecerá sin esfuerzo heroico. Entonces ahora tiene dos cabezas en la rama nombradas por defecto. Después de 'hg merge' (y confirmarlo) volverá a una cabeza en la rama llamada default. –

+0

Guau, no sabía esto sobre las cabezas. Gracias por señalar eso :) – hsribei

19

Esto está cerca:

hg update --clean

+4

sí ... a veces cuando mueves archivos (de un directorio a otro) y luego decides rascar todo, no hace lo mismo que 'git reset --hard' haría. Ergo - mercurial es estúpido – Agzam

8

del Manual de Hg GitConcepts La página explica cómo hacer muchas acciones git que los usuarios conocen en Mercurial.

Mercurial no tiene ningún comportamiento incorporado git reset --hard. Sin embargo, la extensión strip proporciona un comando strip que sí lo hace. Para utilizar, first enable strip en su archivo ~/.hgrc ::

[extensions] 
strip = 

Nota: esta extensión en el nuevo Mercurial en-2.8. Las versiones anteriores proporcionaban el comando strip en el mq extension.

Ahora puede ejecutar comandos como hg strip o incluso hg help strip. Para eliminar un conjunto de cambios y todos sus elementos secundarios, simplemente especifique ese conjunto de cambios como argumento en hg strip. Por ejemplo, para eliminar la última confirmación que acaba de realizar (después de haber utilizado los comandos que causaron hg rollback para informar que ya no hay ninguna transacción que deshacer), puede eliminar la revisión tip. Cada vez que ejecuta este comando, se eliminará otra revisión. hg strip Las acciones deben considerarse irreversibles; Los usuarios desconocidos deben realizar copias de seguridad de sus repositorios antes de usarlos.

$ hg strip tip 

Por ejemplo, con revsets syntax, me indican que me quiero quitar ningún commit de la mina que dan lugar a cabezas adicionales que se muestran cuando corro hg heads. Si especifica una revisión particular en la expresión siguiente que no sea tip, se recortará todo en la rama actual que no sea un antecesor de la revisión elegida. Esto parece más cercano al comportamiento que quiero cuando publico el comando git reset --hard HEAD.

$ hg strip "branch(tip) and not(ancestors(tip)::tip)" 
+2

Mercurial 2.8 y superior tiene una extensión '' strip'' en caso de que uno solo quiera el comando '' hg strip'' explícitamente. Usar '' mq'' agrega una variedad de otros comandos de administración de parches también. – davidjb

8

De git, los comandos: [? ¿Cómo deshacerse de algunas de cambios en Hg]

git reset --hard  # reset to last commit  
git clean -df  # delete untracked files 

son iguales a

hg update --clean # reset to last commit 
hg purge    # delete untracked files 
+7

Si bien este fragmento de código puede resolver la pregunta, [incluyendo una explicación] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. –

+0

'git reset --hard' no elimina archivos sin seguimiento. – Ruslan

+0

No funciona para mí. 'hg update --clean 18: 8e139889ff02' dice" 2 archivos actualizados ", sin embargo, cuando miro el registro, todavía está donde estaba. ** UPD **: dicho esto, restableció los archivos a la revisión. Sin embargo, eso es solo la mitad del comportamiento de 'git reset --hard'. –

Cuestiones relacionadas