significado nike english mercurial

nike - Mercurial: ¿cómo deshacer el último commit sin pulir?



mercurial svn (4)

Accidentalmente me he comprometido con mi repositorio local. Para ser más específicos, cometí cambios en muchos archivos a la vez, cuando tenía la intención de enviarlos uno por uno.

¿Cómo deshago este compromiso y devuelvo mi copia de trabajo al estado en que estaba antes del compromiso para poder hacer lo que debería haber hecho en primer lugar?

No he empujado ni tirado ni nada más desde el cometer.

Puede sospechar que esto es un duplicado, así que explicaré por qué las siguientes preguntas son diferentes o no responderé mi pregunta:

Mercurial deshacer ultimo commit

Una respuesta a esta pregunta indica que puede hacer esto con hg commit --amend , pero no explica cómo o da un ejemplo de cómo hacerlo. La ayuda de mercurail tampoco me lo explica.

¿Cómo se "deshace" por última vez en Mercurial?

Estados a utilizar hg rollback . Aparentemente, este comando está en desuso. Intenté usarlo de todos modos, pero obtuve el mensaje: no hay información disponible para la reversión . Una pena que esto no funcione, ya que sería una manera muy intuitiva de lograr lo que quiero.


Basado en información de esta pregunta :

hg strip --keep --rev .
--keep: do not modify working directory during strip
--rev . (el punto denota la última confirmación. lea la respuesta de sid0 con respecto a los descendientes)

Para personas más familiarizadas con git language, estás buscando git reset --mixed HEAD^

hard que descartaría tus cambios, haciendo que tu trabajo "desaparezca" (asumo que no es una opción)

soft deshacería la confirmación, pero mantendría indexados los archivos previamente confirmados (es decir, rastreados)

mixed mantiene los archivos modificados en su lugar, pero le dice al índice que deshaga la confirmación. en git-speak: git st diría que los Changes not staged for commit

Consulte también git-reset docs , Diferencia git reset suave / mixta , git / hg Tabla de equivalencia de comandos


Lo que haría en esta situación es crear una nueva rama que tenga los cambios que quiero antes de que alguna vez haya pensado en eliminar el conjunto de cambios incorrectos. Entonces, en este caso, tendré que volver a la revisión antes de realizar la confirmación incorrecta, volver a realizar mis cambios y luego realizar varias confirmaciones, una para cada archivo.

Paso a paso:

1) Volver a cometer antes el mal.

% cd <top of repo> % hg log -l 5 <identify the last good revision> % hg update -r <last good revision number>

2) Repita los cambios: obtendré un parche que describe los cambios que deseo y lo aplicaré al árbol. (Estoy asumiendo que la punta actualmente apunta a donde empezamos)

% hg diff -r .:tip | patch -p1 patching file a/b/c/d patching file a/b/e/f

3) Haga nuevos confirmaciones: ahora estamos de vuelta en el estado antes de que realice la confirmación que desea dividir. Haga el hg status y mire los archivos modificados, asegúrese de que todo sea como espera. En este punto, puede confirmar los archivos uno por uno nombrándolos en la línea de comandos o usar una extensión como record o crecord para seleccionarlos interactivamente.

% hg commit a/b/c/d % hg commit a/b/e/f

...o...

% hg crecord <select files in UI> % hg crecord <select files in UI>

Terminarás con un repo que se ve así:

o----o----B / / --o----o----o----T

Donde B es el antiguo compromiso incorrecto, y T es el nuevo consejo del repositorio. Si desea que esa rama quede cerrada, para que no aparezca en los registros / etc, puede ...

% hg update -r <revision B> % hg commit --close_branch % hg update -r tip

Si quieres eliminarlo por completo, puedes despojarlo.

% hg strip -r <revision B>

De cualquier manera, su registro se verá como si nada hubiera pasado.


Ok, creo que encontré la respuesta, es habilitar la extensión de strip y usar el siguiente comando:

hg strip -r -1 --keep

Esto elimina la última revisión del repostorio (el bit -r -1 ), y la opción --keep significa que no se realizan cambios a la copia de trabajo. Así que terminas con una copia de trabajo exactamente como estaba justo antes de la confirmación, y no la última confirmación en el repositorio.

No soy un experto en mercuriales, así que úsalo bajo tu propio riesgo.


comentar y elaborar la publicación de @ crobar causa # de personajes no es suficiente.

cuando realice una confirmación local (sin inserción), ejecute hg strip -r -1 --keep , borra su confirmación anterior Y conserva su lista de archivos que esperan ser enviados. Básicamente esto es un completo deshacer. si utilizo hg stripe -r -1 sin el --keep , todavía borra su confirmación anterior, PERO cuando intento enumerar los archivos que se deben confirmar, no puedo encontrar un cambio, así que no recomendaría hacerlo.

si hago una confirmación, entonces hago una inserción (a distancia) y luego hg strip -r -1 --keep , hace exactamente lo que se supone que debe hacer PERO cuando haces otra confirmación, luego crea, otra rama.

I.E. o----o----Branch(local) / / --o----o----o----Branch(with previous push)

Mi fuente / referencia: probando estos escenarios