tutorial mercurial commit amend mercurial-commit

mercurial repository tutorial



Mercurial: ¿Cómo modificar el último commit? (6)

GUI equivalente para hg commit --amend :

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

Cambie a la vista ''Confirmar'' o, en la vista del entorno de trabajo, seleccione la entrada ''directorio de trabajo''. El botón ''Confirmar'' tiene una opción llamada ''Modificar revisión actual'' (haga clic en la flecha desplegable del botón para encontrarla).

|| || //

Advertencia :

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

Al hacer clic en el botón se llamará "confirmar - enmendar" para "modificar" la revisión.

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

Estoy buscando una contraparte de git commit --amend en Mercurial, es decir, una forma de modificar el commit al que está vinculada mi copia de trabajo. Los requisitos para este procedimiento de enmienda son:

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

  • si el compromiso de modificación es uno de los encabezados de mi rama actual, no se debe crear un nuevo encabezado . Si el commit no es head, se puede crear una nueva head.

  • el procedimiento debe ser seguro de forma tal que, si por alguna razón falla la modificación, deseo que se restablezca la misma copia de trabajo y el mismo estado de depósito que antes de la modificación. En otras palabras, si la modificación misma puede fallar, debería haber un procedimiento a prueba de fallas para restaurar la copia de trabajo y el estado del repositorio. Me refiero a "fallas" que se encuentran en la naturaleza del procedimiento de enmienda (como, por ejemplo, conflictos), no a problemas relacionados con el sistema de archivos (como restricciones de acceso, no poder bloquear un archivo para escribir, ... )

Actualización (1):

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

Actualización (2):

  • los archivos en el directorio de trabajo no deben tocarse (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.

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

Desde la referencia de la línea de comandos :

El indicador de enmienda se puede usar para modificar el elemento primario del directorio de trabajo con un nuevo compromiso que contenga los cambios en el elemento principal además de los reportados actualmente por el estado de hg, si hay alguno. El compromiso anterior se almacena en un paquete de copia de seguridad en .hg / strip-backup (consulte hg help bundle y hg help desagregado sobre cómo restaurarlo).

Mensaje, usuario y 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", ya que se basa en la característica "Fases" relativamente nueva para evitar que las actualizaciones cambien el historial que ya está disponible fuera del repositorio local.


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

Suposiciones

  • has cometido un (!) conjunto de cambios pero aún no lo has empujado
  • 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 el último commit
  • Comprometerse de nuevo con los nuevos cambios en el lugar.

La reversión realmente 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 un commit. Mercurial realiza un seguimiento de las longitudes de los archivos de la última transacción y, por lo tanto, puede deshacer completamente un paso truncando los archivos a sus longitudes anteriores.


Las versiones recientes de Mercurial incluyen la extensión evolve que proporciona el comando hg amend . Esto permite modificar un compromiso sin perder el historial de modificación previa en su control de versión.

hg enmendar [OPCIONAL] ... [ARCHIVO] ...

alias: actualizar

Combine un conjunto de cambios con actualizaciones y sustitúyalo 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).

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


Suponiendo que aún no ha propagado 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 con la revisión cero o hacer estallar todos los parches, para el último solo basta con un pop ( hg qpop ) (ver más abajo).

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

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

Si no quieres recuperar todo tu parche, puedes editarlo usando hg qimport -r0:tip (o similar), luego edita cosas y usa hg qrefresh para combinar los cambios en el parche más alto de tu 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 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 altamente desalentador y arriesgado . Haga una copia de seguridad de todo antes de hacer esto!

Como una nota al margen, lo he hecho miles de veces en repositorios privados.


Tienes 3 opciones para editar confirmaciones en Mercurial:

  1. hg strip --keep --rev -1 deshace los últimos (1) compromisos, para que pueda hacerlo nuevamente (consulte esta respuesta para obtener más información).

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

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

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

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

Realmente no estoy 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.