Mercurial-volver a la versión anterior y continuar desde allí


Estoy usando Mercurial localmente para un proyecto (es el único repositorio que no hay que empujar/tirar hacia/desde ningún otro lugar).

Hasta la fecha tiene una historia lineal. Sin embargo, en lo que estoy trabajando ahora me he dado cuenta de que es un enfoque terrible y quiero volver a la versión antes de iniciarla e implementarla de una manera diferente.

Estoy un poco confundido con el branch / revert / update -C comandos en Mercurial. Básicamente quiero volver a la versión 38 (actualmente en 45) y tener mi las siguientes confirmaciones tienen 38 como padre y continúan desde allí. No me importa si las revisiones 39-45 se pierden para siempre o terminan en una rama sin salida propia.

¿Qué comando / conjunto de comandos necesito?

Author: van, 2010-03-29

7 answers

hg update [-r REV]

Si luego confirmas, crearás efectivamente una nueva rama. Entonces puede continuar trabajando solo en esta rama o eventualmente fusionar la existente en ella.

 142
Author: van,
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
2010-03-29 18:56:50

Aquí está la hoja de trucos sobre los comandos:

  • hg update cambia la revisión padre de la copia de trabajo y también cambia el contenido del archivo para que coincida con esta nueva revisión padre. Esto significa que las nuevas confirmaciones continuarán a partir de la revisión a la que actualices.

  • hg revert solo cambia el contenido del archivo y deja la revisión principal de la copia de trabajo sola. Normalmente utilizas hg revert cuando decides que no quieres mantener los cambios no comprometidos que has hecho a un archivo en su copia de trabajo.

  • hg branch inicia una nueva rama con nombre. Piense en una rama con nombre como una etiqueta que asigna a los conjuntos de cambios. Así que si haces hg branch red, entonces los siguientes conjuntos de cambios serán marcados como pertenecientes en la rama "roja". Esta puede ser una buena manera de organizar conjuntos de cambios, especialmente cuando diferentes personas trabajan en diferentes ramas y luego desea ver de dónde se originó un conjunto de cambios. Pero usted no quiere usarlo en su situación.

Si usas hg update --rev 38, entonces los conjuntos de cambios 39-45 quedarán como un callejón sin salida - una cabeza colgando como lo llamamos. Recibirás una advertencia cuando envíes, ya que estarás creando "múltiples cabezas" en el repositorio al que envíes. La advertencia está ahí ya que es un poco descortés dejar esas cabezas alrededor ya que sugieren que alguien necesita hacer una fusión. Pero en tu caso puedes seguir adelante y hg push --force ya que realmente quieres dejarlo colgado.

Si no tiene sin embargo, empujó la revisión 39-45 en otro lugar, entonces puede mantenerlos privados. Es muy simple: con hg clone --rev 38 foo foo-38 obtendrá un nuevo clon local que solo contiene hasta la revisión 38. Puede continuar trabajando en foo-38 y empujar los nuevos (buenos) conjuntos de cambios que cree. Todavía tendrá las revisiones antiguas (malas) en su clon foo. (Usted es libre de cambiar el nombre de los clones como desee, por ejemplo, foo a foo-bad y foo-38 a foo.)

Finalmente, también puedes usar hg revert --all --rev 38 y luego confirmar. Esto creará un revisión 46, que parece idéntica a la revisión 38. Luego continuará trabajando desde la revisión 46. Esto no creará una bifurcación en la historia de la misma manera explícita que lo hizo hg update, pero por otro lado no obtendrá quejas sobre tener múltiples cabezas. Usaría hg revert si estuviera colaborando con otros que ya han hecho su propio trabajo basado en la revisión 45. De lo contrario, hg update es más explícito.

 382
Author: Martin Geisler,
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-12-07 23:40:30

Acabo de encontrar un caso de necesidad de revertir solo un archivo a la revisión anterior, justo después de haber hecho commit y push. La sintaxis abreviada para especificar estas revisiones no está cubierta por las otras respuestas, así que aquí está el comando para hacer eso

hg revert path/to/file -r-2

Que -2 volverá a la versión anterior a la última confirmación, usando -1 solo revertirá los cambios actuales no confirmados.

 28
Author: hyde,
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-04-09 10:16:59

EN mi humilde opinión, hg strip -r 39 se adapta mejor a este caso.

Requiere que la extensión mq esté habilitada y tiene las mismas limitaciones que el" método de clonación repo " recomendado por Martin Geisler: Si el conjunto de cambios se publicó de alguna manera, (probablemente) volverá a su repositorio en algún momento porque solo cambió su repositorio local.

 7
Author: magras,
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-09-20 20:13:45

Después de usar hg update -r REV no estaba claro en la respuesta sobre cómo confirmar ese cambio para que luego pueda enviar.

Si solo intentas confirmar después de la actualización, Mercurial no cree que haya ningún cambio.

Primero tuve que hacer un cambio en cualquier archivo (digamos en un README) para que Mercurial reconociera que hice un nuevo cambio, luego pude confirmarlo.

Esto entonces creó dos cabezas como se mencionó.

Para deshacerme de la otra cabeza antes de empujar, entonces seguí la No-Op Fusiona paso para remediar esa situación.

Entonces pude empujar.

 6
Author: Brian Gershon,
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-08-16 21:54:53

Las respuestas anteriores fueron muy útiles y aprendí mucho. Sin embargo, para mis necesidades la respuesta sucinta es:

hg revert --all --rev ${1}

hg commit -m "Restoring branch ${1} as default"

Donde ${1} es el número de la revisión o el nombre de la rama. Estas dos líneas son en realidad parte de un script bash, pero funcionan bien por su cuenta si quieres hacerlo manualmente.

Esto es útil si necesita agregar una revisión en caliente a una rama de lanzamiento, pero necesita compilar desde el valor predeterminado (hasta que tengamos nuestras herramientas de CI correctas y podamos compilar desde ramas y luego hacerlo away with release branches as well).

 3
Author: Brian Carr,
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-01 11:05:42

Instalaría Tortoise Hg (una GUI gratuita para Mercurial) y la usaría. A continuación, puede hacer clic con el botón derecho en una revisión a la que desee volver-con todos los mensajes de confirmación allí frente a sus ojos - y 'Revertir todos los archivos'. Hace que sea intuitivo y fácil rodar hacia atrás y hacia adelante entre versiones de un conjunto de archivos, lo que puede ser realmente útil si está buscando establecer cuándo apareció un problema por primera vez.

 1
Author: Geoff Kendall,
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
2017-10-26 12:40:04