2010-02-01 17 views
33

Supongamos que he realizado algunos cambios en el directorio de trabajo y marqué accidentalmente varios archivos (que incluyen algunos de los modificados) para su eliminación. ¿Cómo elimino la marca de los archivos para eliminarlos sin perder los cambios que hice?Deshacer una acción de eliminación en Mercurial

Respuesta

17

hg revert

Estoy bastante seguro de Mercurial incluso hace copias de seguridad de los cambios de forma predeterminada.

+1

sí, a menos que diga que no, los cambios se ponen en .orig archivos –

+1

Acabo de ejecutar 'hg revert' en un archivo que eliminé indirectamente con' hg mv'. No lo hizo ** NO ** almacenó mis cambios, y volvió a la copia del último commit. – cesar

+4

esta es _no_ la respuesta correcta. Revertir altera el funcionamiento del directorio y esta pregunta es sobre cómo deshacer una "marca para eliminar" –

21

hay dos opciones: utilizando hg revert

hg revert -a

que volver a la revisión anterior y poner todos los cambios en los archivos nuevos con .orig añadirá a los nombres

hg volver [nombres de los archivos a unremove] simplemente invertir esos archivos

que probablemente iría con este último

+0

Ok, estoy consciente de revertir. Como utilicé "hg remove -Af" (es decir, eliminé los archivos del repositorio en el siguiente compromiso y no desde el disco), estaba buscando una solución que simplemente desmarque los archivos para que permanezcan en el repositorio. "hg revertir" también los reemplazará con versiones anteriores. Esperaba que hubiera una forma similar a "hg add"/"hg forget". "hg forget" solo quita la marca de los archivos marcados para sumar en el siguiente commit. – Kostas

+0

AFAIK revertir es su única opción para deshacer la eliminación. Sin duda, la ayuda para eliminar dice volver a ver para eliminar cosas (mientras que, como dices, agregar sugiere olvidar como un opuesto). deberías obtener .orig archivos con tus cambios en –

+0

En serio. Solo quiero que deje caer la marca "eliminar" de algunos archivos que accidentalmente "olvidé". NO QUIERO MIS ARCHIVOS MODIFICADOS. Si accidentalmente agrego hg, hg olvide deshacerte. Lo opuesto no es verdad. Si olvidé un archivo, ninguna cantidad de hg adding lo desmarcará. BOOOOOOO TERRIBLE UX. –

3

Después de tu comentario a jk, marqué hg forget. Parece ser solo un atajo para hg remove -Af, lo que significa que este es el verdadero opuesto al hg add.

Después de eso, si ha usado hg remove -Af, entonces debería poder revertirlo usando hg add (lo probé y parece que funciona).

2

Los marcadores se almacenan en el archivo .hg/dirstate. Todo lo que necesita hacer para obtener uno antes de emitir hg remove -Af. Puede verse así (no probado):

hg clone bad-repo orig-repo 
cp orig-repo/.hg/dirstate bad-repo/.hg/dirstate 
cd bad-repo 
hg status 

El último comando debe mostrar el estado antes de eliminar los archivos.

32

Solo hg add los archivos.

No sé por qué está recibiendo algunas respuestas que modifican el directorio de trabajo. Si ha marcado accidentalmente algunos archivos para eliminarlos, puede deshacerlos con Agregar.

[email protected]:~/hgtest$ hg status --all 
M another_file 
C a_file 
[email protected]:~/hgtest$ hg remove --after --force * 
[email protected]:~/hgtest$ hg status --all 
R a_file 
R another_file 
[email protected]:~/hgtest$ hg add * 
[email protected]:~/hgtest$ hg status --all 
M another_file 
C a_file 

Dicho esto, no utilice --force con hg remove o alguna vez realmente. También trato de adquirir el hábito de usar hg forget en lugar de hg remove --after,

+0

Bastante seguro de que esta es la respuesta correcta, y necesita más votos ascendentes para llegar a la cima. – slim

+7

Advertencia: Al hacer 'hg eliminar [archivo]' en un archivo sin modificar, se elimina el archivo del sistema de archivos. En este caso, 'hg add [file]' falla y para volver a agregarlo debe hacer 'hg revert [file]'. 'hg add [file]' es la respuesta correcta para los archivos que se han modificado antes de la eliminación. – dinosaur

+0

Es cierto. Es por eso que 'hg forget' es siempre una mejor opción. Deje la eliminación en buena 'vieja '(no mercurial)' rm'. –

3

Tuve exactamente el mismo problema. hg add es el inverso a hg forget (al igual que sucede lo contrario). Sin embargo, intentar volver a agregar el directorio no funcionó. En cambio, tuve que usar hg add en cada archivo:

hg st | egrep "^R" | sed -e "s/R //" | xargs hg add 

Espero que ayude. Tenga en cuenta que en mi caso, no había nada que legítimamente quisiera eliminar. Si tiene archivos que definitivamente desea eliminar, ajuste el grep en consecuencia.

5

Si el archivo existe, (si es probable que haya marcado para realizar una extracción con hg forget o Si modificó entonces hg remove d ella), hacer hg add [file] para agregarlo atrás con los cambios realizados después de la última confirmación y antes olvidando el archivo.

Si el archivo no existe (probablemente si el archivo no se modificó y ha marcado el archivo para eliminarlo usando hg remove), realice hg revert [file] para revertirlo a su estado en el elemento primario del directorio de trabajo.

+1

Esta respuesta es mucho mejor que la más votada, ya que explica por qué y cuándo funciona cada comando en lugar de solo dar una receta. –

Cuestiones relacionadas