Mercurial: ¿cómo modificar la última confirmación?


Estoy buscando una contra-parte de git commit --amend en Mercurial, es decir, una forma de modificar la confirmación a la que está vinculada mi copia de trabajo. Los requisitos para este procedimiento de modificación son:

  • Si es posible, no debería requerir ninguna extensión. Debe no requerir extensiones no predeterminadas, es decir, extensiones que no vienen con una instalación oficial de Mercurial.

  • Si el commit to amend es una cabecera de mi rama actual, no se debe crear ninguna nueva cabecera. Si el commit no es head, se puede crear un nuevo head.

  • El procedimiento debe ser seguro de manera que si por cualquier razón la modificación falla, quiero que se restaure la misma copia de trabajo y el mismo estado del repositorio que antes de la modificación. En otras palabras, si la modificación en sí puede fallar, debe haber un procedimiento a prueba de fallos para restaurar la copia de trabajo y el estado del repositorio. Me refiero a los "fracasos" que se encuentran en la naturaleza del procedimiento de enmienda (como, por ejemplo, los conflictos), no a problemas relacionados con el sistema de archivos (como restricciones de acceso, no poder bloquear un archivo para escribir,...)

Actualizar (1):

  • el procedimiento debe ser automatizable, por lo que puede ser realizado por un cliente GUI sin necesidad de interacción del usuario.

Actualizar (2):

  • los archivos en el directorio de trabajo no deben ser tocados (puede haber bloqueos del sistema de archivos en ciertos archivos modificados). Esto significa especialmente, que un posible enfoque puede en ningún momento requerir un directorio de trabajo limpio.
Author: Gangnus, 2011-11-18

6 answers

Con la publicación de Mercurial 2.2 , puede usar la opción --amend con hg commit para actualizar la última confirmación con el directorio de trabajo actual

Desde la referencia de la línea de comandos :

El indicador amend amend se puede usar para modificar el padre del directorio de trabajo con una nueva confirmación que contenga los cambios en el padre además de los reportados actualmente por hg status, si hay alguno. La confirmación antigua se almacena en un paquete de copia de seguridad en .hg / strip-backup (consulte hg help bundle y hg help unbunddle sobre cómo restaurarlo).

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

Lo bueno es que este mecanismo es "seguro", porque se basa en la característica relativamente nueva de "Fases" para evitar actualizaciones que cambiarían el historial que ya se ha hecho disponible fuera del local repositorio.

 272
Author: Chris Phillips,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-29 14:27:16

Tienes 3 opciones para editar confirmaciones en Mercurial:

  1. hg strip --keep --rev -1 deshaga la (s) última(s) confirmación (es), para que pueda volver a hacerlo (vea esta respuesta para más información).

  2. Usando la extensión MQ , que se envía con Mercurial

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

También puede echar un vistazo a la página Historial de edición del Mercurial wiki.

En resumen, editar la historia es realmente difícil y desalentado. Y si ya has empujado tus cambios, apenas hay nada que puedas hacer, excepto si tienes el control total de todos los otros clones.

No estoy muy familiarizado con el comando git commit --amend, pero AFAIK, Histedit es lo que parece ser el enfoque más cercano, pero lamentablemente no se incluye con Mercurial. MQ es realmente complicado de usar, pero puedes hacer casi cualquier cosa con él.

 50
Author: krtek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-22 10:09:40

Equivalente GUI para hg commit --amend:

Esto también funciona desde la GUI de TortoiseHg (estoy usando v2.5):

Pase a la vista 'Commit' o, en la vista workbench, seleccione la entrada 'working directory'. El botón 'Confirmar' tiene una opción llamada 'Modificar revisión actual' (haga clic en la flecha desplegable del botón para encontrarlo).

introduzca la descripción de la imagen aquí

          ||
          ||
          \/

introduzca la descripción de la imagen aquí

Caveat emptor :

Esta opción adicional solo se habilitará si la versión mercurial es al menos 2.2.0, y si la revisión actual no es pública, no es un parche y no tiene niño. [...]

Al hacer clic en el botón se llamará "commit amend amend" por "amend" la revisión.

Más información sobre esto en el canal THG dev

 36
Author: Cristi Diaconescu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-04 11:04:08

Asumiendo que aún no ha propagado sus cambios, esto es lo que puede hacer.

  • Añadir a su .hgrc:

    [extensions]
    mq =
    
  • En su repositorio:

    hg qimport -r0:tip
    hg qpop -a
    

    Por supuesto, no necesita comenzar con la revisión cero o pop todos los parches, para el último solo un pop (hg qpop) es suficiente (ver más abajo).

  • Elimine la última entrada en el archivo .hg/patches/series, o los parches que no le gustan. Reordenar es posible demasiado.

  • hg qpush -a; hg qfinish -a
  • elimine los archivos .diff (parches no aplicados) que aún están dentro .hg/parches (debe ser uno en su caso).

Si no quiere que recupere todo de su parche, puede editarlo usandohg qimport -r0:tip (o similar), luego edite cosas y use hg qrefresh para fusionar los cambios en el parche más alto de su pila. Leer hg help qrefresh.

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

Por supuesto, este procedimiento es altamente desalentado y arriesgado. Hacer una copia de seguridad de todo antes de hacer esto!

Como nota al margen, lo he hecho millones de veces en repositorios de solo privado.

 8
Author: hochl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-18 14:15:31

Estoy sintonizando con lo que krtek ha escrito. Más específicamente solución 1:

Supuestos:

  • has cometido uno (!) conjunto de cambios, pero no lo han empujado todavía
  • desea modificar este conjunto de cambios (por ejemplo, agregar, eliminar o cambiar archivos y/o el mensaje de confirmación)

Solución:

  • usa hg rollback para deshacer la última confirmación
  • confirmar de nuevo con los nuevos cambios en su lugar

La reversión realmente deshace la última operación. Su forma de trabajar es bastante simple: las operaciones normales en HG solo se anexarán a los archivos; esto incluye una confirmación. Mercurial realiza un seguimiento de las longitudes de archivo de la última transacción y, por lo tanto, puede deshacer completamente un paso truncando los archivos a sus longitudes antiguas.

 6
Author: Lucero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-18 13:47:33

Las versiones recientes de Mercurial incluyen la extensión evolve que proporciona el comando hg amend. Esto permite modificar una confirmación sin perder el historial de modificaciones previas en su control de versiones.

Hg modifíquese [OPCIÓN]... [FILE]...

Alias: refresh

Combine un conjunto de cambios con actualizaciones y reemplácelo por uno nuevo

Commits a new changeset incorporating both the changes to the given files
and all the changes from the current parent changeset into the repository.

See 'hg commit' for details about committing changes.

If you don't specify -m, the parent's message will be reused.

Behind the scenes, Mercurial first commits the update as a regular child
of the current parent. Then it creates a new commit on the parent's
parents with the updated contents. Then it changes the working copy parent
to this new combined changeset. Finally, the old changeset and its update
are hidden from 'hg log' (unless you use --hidden with log).

Véase https://www.mercurial-scm.org/doc/evolution/user-guide.html#example-3-amend-a-changeset-with-evolve para una descripción completa de la extensión evolve.

 0
Author: Karl Bartel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-06 12:12:42