Estoy buscando una contraparte de git commit --amend
en Mercurial, es decir, una forma de modificar la confirmación a la que está vinculada mi copia de trabajo. Solo me interesa la última confirmación, no una confirmación previa arbitraria.
Los requisitos para este procedimiento de modificación 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 enmendar es un jefe de mi rama actual, no se debe crear un nuevo jefe . Si el commit no es head, se puede crear un nuevo head.
el procedimiento debe ser seguro de manera que si, por cualquier motivo, la modificación falla, quiero tener la misma copia de trabajo y el mismo estado de repositorio restaurado que antes de la modificación. En otras palabras, si la enmienda misma puede fallar, debe 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 escritura, ... )
Actualización (1):
- El procedimiento debe ser automatizable , por lo que puede ser realizado por un cliente GUI sin necesidad de interacció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 en ningún momento puede requerir un directorio de trabajo limpio.
fuente
Tiene 3 opciones para editar confirmaciones en Mercurial:
hg strip --keep --rev -1
deshaga los últimos (1) commit (s), para que pueda hacerlo nuevamente (consulte esta respuesta para obtener más información).Usando la extensión MQ , que se envía con Mercurial
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 de Historial de edición de la wiki de Mercurial.
En resumen, editar la historia es realmente difícil y desalentado . Y si ya ha presionado sus cambios, apenas hay nada que pueda hacer, excepto si tiene el control total de todos los demás clones.
No estoy realmente familiarizado con el
git commit --amend
comando, pero AFAIK, Histedit es lo que parece ser el enfoque más cercano, pero lamentablemente no se envía con Mercurial. MQ es realmente complicado de usar, pero puedes hacer casi cualquier cosa con él.fuente
hg revert myfile
para deshacer la eliminación. Tal vez volver a agregar conhg add
el archivo después de querollback
también funcione.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 banco de trabajo, seleccione la entrada 'directorio de trabajo'. El botón 'Confirmar' tiene una opción llamada 'Modificar la revisión actual' (haga clic en la flecha desplegable del botón para encontrarla).
Advertencia :
Más información sobre esto en el canal de desarrollo de THG
fuente
Estoy sintonizando lo que Krtek ha escrito. Más específicamente la solución 1:
Suposiciones
Solución:
hg rollback
para deshacer la última confirmaciónLa 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 la longitud de los archivos de la última transacción y, por lo tanto, puede deshacer completamente un paso truncando los archivos a sus longitudes anteriores.
fuente
Suponiendo que aún no ha propagado sus cambios, esto es lo que puede hacer.
Agregue a su .hgrc:
En tu repositorio:
Por supuesto, no necesita comenzar con la revisión cero o hacer estallar todos los parches, ya que para el último solo basta con un pop (
hg qpop
) (ver más abajo).elimine la última entrada del
.hg/patches/series
archivo o los parches que no le gustan. El reordenamiento también es posible.hg qpush -a; hg qfinish -a
.diff
archivos (parches no aplicados) aún en .hg / parches (debería ser uno en su caso).Si usted no desea a recuperar todo de su parche, se puede editar mediante el uso
hg qimport -r0:tip
(o similar), a continuación, editar la materia y el usohg qrefresh
de fusionar los cambios en el parche superior de la pila. Leerhg help qrefresh
.Al editar
.hg/patches/series
, incluso puede eliminar varios parches o reordenar algunos. Si su última revisión es 99, puede usarlahg 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 nota al margen, lo he hecho millones de veces en repositorios privados.
fuente
hg qfold
, por ciertohg import -r<prev>:tip
. Una pena que no haya un atajo para la versión anterior, como en subversion.Las versiones recientes de Mercurial incluyen la
evolve
extensión que proporciona elhg amend
comando. Esto permite enmendar una confirmación sin perder el historial previo a la modificación en su control de versión.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
evolve
extensión.fuente
Es posible que no resuelva todos los problemas en la pregunta original, pero dado que esta parece ser la publicación de facto sobre cómo Mercurial puede enmendar la confirmación anterior, agregaré mi información de 2 centavos.
Si eres como yo y solo deseas modificar el mensaje de confirmación anterior (corregir un error tipográfico, etc.) sin agregar ningún archivo, esto funcionará
Sin ningún patrón de inclusión o exclusión, se
hg commit
incluirán por defecto todos los archivos en el directorio de trabajo. La aplicación del patrón-X 'glob:**'
excluirá todos los archivos posibles, permitiendo solo modificar el mensaje de confirmación.Funcionalmente es igual que
git commit --amend
cuando no hay archivos en el índice / etapa.fuente
Otra solución podría ser usar el
uncommit
comando para excluir un archivo específico de la confirmación actual.hg uncommit [file/directory]
Esto es muy útil cuando desea mantener la confirmación actual y deseleccionar algunos archivos de la confirmación (especialmente útil para
files/directories
haber sido eliminados).fuente