Mercurial: ¿cómo enmendar la última solución?

Estoy buscando git commit --amend en Mercurial, es decir, una forma de cambiar el commit con el que está asociada mi copia de trabajo. Requisitos para este procedimiento de cambio:

  • Si es posible, no requiere ninguna extensión. No debe requerir extensiones no predeterminadas , es decir, extensiones que no vienen con la instalación oficial de Mercurial.

  • Si el compromiso de enmienda es uno de los jefes de mi rama actual, no hay un nuevo jefe . Si la fijación no es una cabeza, se puede crear una nueva cabeza.

  • el procedimiento debe ser seguro de tal manera que si por alguna razón no se realiza la corrección, quiero restaurar la copia de trabajo anterior y el estado del repositorio antes de realizar cualquier modificación. En otras palabras, si la enmienda en sí puede fallar, debe haber un procedimiento a prueba de fallas para restaurar las condiciones de trabajo y almacenamiento. Me refiero a "fallas" que se encuentran en la naturaleza del procedimiento de remediación (por ejemplo, conflictos), y no a problemas con el sistema de archivos (por ejemplo, restricciones de acceso, imposibilidad de bloquear un archivo para escribir, ...)

Actualización (1):

  • el procedimiento debe ser automatizado , de modo que el cliente de la GUI pueda realizarlo sin la interacción del usuario.

Actualización (2):

  • los archivos en el directorio de trabajo no deberían verse afectados (puede haber bloqueos del sistema de archivos en algunos archivos modificados). Esto significa especialmente que un posible enfoque de ninguna manera puede requerir un directorio de trabajo limpio.
188
18 нояб. fijado por mstrap 18 nov. 2011-11-18 16:04 '11 a las 4:04 pm 2011-11-18 16:04
@ 5 respuestas

Con el lanzamiento de Mercurial 2.2, puede usar la opción --amend con hg commit para actualizar el último commit del directorio de trabajo actual

Desde el enlace en la línea de comando :

El indicador de modificación se puede usar para cambiar el elemento primario del directorio de trabajo con un nuevo cierre que contiene cambios en el objeto principal, además de los que se pasan actualmente en el estado de hg, si corresponde. El compromiso anterior se almacena en el conjunto de copia de seguridad en .hg / strip-backup (consulte Hg help bundle y hg help se desglosa sobre cómo restaurarlo).

El mensaje, el usuario y la fecha se toman de la confirmación modificada, si no se especifica. Cuando el mensaje no se especifica en la línea de comandos, el editor se abrirá con un mensaje de la confirmación modificada.

Lo bueno es que este mecanismo es "seguro" porque utiliza la función "Fase" relativamente nueva para evitar actualizaciones que cambiarán el historial que ya estaba disponible fuera del repositorio local.

256
02 мая '12 в 21:46 2012-05-02 21:46 Chris Phillips respondió el 2 de mayo de 2012 a las 21:46 2012-05-02 21:46

Tienes 3 opciones para editar confirmaciones en Mercurial:

  • hg strip --keep --rev -1 últimas (1) confirmaciones, para que pueda volver a hacerlo (consulte esta respuesta para obtener más información).

  • Usando la extensión MQ que viene con Mercurial

  • Incluso si no se envía con Mercurial, vale la pena mencionar la extensión de Histedit .

También puede consultar la página Historial de edición en la versión de wiki de Mercurial.

border=0

En resumen, la historia de edición es realmente complicada y desalentada . Y si ya ha presionado sus cambios, no puede hacer nada, excepto cuando tiene control total sobre todos los otros clones.

No estoy muy familiarizado con el git commit --amend , pero AFAIK, Histedit es lo que parece ser el enfoque más cercano, pero desafortunadamente no viene con Mercurial. MQ es realmente difícil de usar, pero puedes hacer cualquier cosa con él.

49
18 нояб. la respuesta es dada por krtek 18 nov. 2011-11-18 16:34 '11 a las 4:34 pm 2011-11-18 16:34

GUI equivalente para hg commit --amend :

Esto también funciona desde la GUI de TortoiseHG (uso v2.5):

En la vista "Confirmar" o en la vista de entorno de trabajo, seleccione la entrada "directorio de trabajo". El botón "Confirmar" tiene la opción "Cambiar la versión actual" (haga clic en la flecha desplegable del botón para encontrarla).

2019

33
04 янв. La respuesta la da Cristi Diaconescu 04 jan. 2013-01-04 14:04 '13 a las 14:04 2013-01-04 14:04

Suponiendo que aún no ha distribuido sus cambios, esto es lo que puede hacer.

  • Agregue a su .hgrc:

     [extensions] mq = 
  • En tu repositorio:

     hg qimport -r0:tip hg qpop -a 

    Por supuesto, no es necesario comenzar desde cero o flotar a través de todos los parches, ya que para este último es hg qpop un archivo pop ( hg qpop ) (ver más abajo).

  • elimine la última entrada en el .hg/patches/series o correcciones que no le gusten. Reordenar también es posible.

  • hg qpush -a; hg qfinish -a
  • elimine los archivos .diff (arreglos no aplicables) aún en .hg / parches (debe ser uno en su caso).

Si no desea devolver todo su parche, puede editarlo usando hg qimport -r0:tip (o similar), luego edite el material y use hg qrefresh para combinar los cambios en el parche superior de su pila. Leer hg help qrefresh .

Al editar .hg/patches/series , puede eliminar varios parches o cambiar el orden. Si su última revisión es 99, simplemente puede usar hg qimport -r98:tip; hg qpop; [edit series file]; hg qpush -a; hg qfinish -a hg qimport -r98:tip; hg qpop; [edit series file]; hg qpush -a; hg qfinish -a hg qimport -r98:tip; hg qpop; [edit series file]; hg qpush -a; hg qfinish -a .

Por supuesto, este procedimiento es muy desalentador y arriesgado . ¡Haz una copia de seguridad de todo antes de hacerlo!

Como elemento lateral, lo hice dos veces en repositorios con repositorios privados.

8
18 нояб. respuesta dada hochl 18 nov. 2011-11-18 17:04 '11 a las 5:04 pm 2011-11-18 17:04

Personalizo lo que escribió krtek. Más específicamente, la solución 1:

Suposiciones

  • Ha realizado un (!) Conjunto de cambios, pero aún no lo ha presionado.
  • desea cambiar este conjunto de cambios (por ejemplo, agregar, eliminar o cambiar archivos y / o confirmación de mensaje)

Solución:

  • usa hg rollback para deshacer el último commit
  • arreglar nuevos cambios en el lugar de nuevo

Una reversión deshace la última operación. Su forma de trabajar es bastante simple: las operaciones normales en HG solo se agregarán a los archivos; esto incluye la fijación. Mercurial realiza un seguimiento de la longitud del archivo de la última transacción y, por lo tanto, puede deshacer completamente un paso cortando los archivos a sus longitudes anteriores.

6
18 нояб. La respuesta la da Lucero el 18 de noviembre. 2011-11-18 16:47 '11 a las 16:47 2011-11-18 16:47

Otras preguntas en las etiquetas o hacer una pregunta