Mercurial: vuelve a la versión anterior y continúa desde allí

Estoy usando Mercurial localmente para un proyecto (es el único repository que no hay empujando / tirando a / desde cualquier otro lugar).

Hasta la date, tiene una historia lineal. Sin embargo, el tema actual en el que estoy trabajando ahora me he dado count de que es un enfoque terrible y quiero volver a la versión antes de comenzarla e implementarla de otra manera.

Estoy un poco confundido con los commands branch / revert / update -C en Mercurial. Básicamente, quiero volver a la versión 38 (actualmente en 45) y hacer que mis próximos commits tengan 38 como padres y continuar desde allí. No me importa si las revisiones 39-45 se pierden para siempre o terminan en una sucursal sin salida.

¿Qué command / set de commands necesito?

 hg update [-r REV] 

Si más tarde te comprometes, efectivamente crearás una nueva sucursal. Entonces puede continuar trabajando solo en esta twig o eventualmente fusionar la existente en ella.

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

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

  • hg revert cambia el contenido del file únicamente y deja sola la revisión principal de la copy de trabajo. Normalmente utiliza hg revert cuando decide que no desea mantener los cambios sin compromiso que ha realizado en un file en su copy de trabajo.

  • hg branch inicia una nueva twig con nombre. Piense en una twig con nombre como una label que asigne a los sets de cambios. Entonces, si haces hg branch networking , los siguientes sets de cambios se marcarán como pertenecientes a la twig "roja". Esta puede ser una buena forma de organizar sets de cambios, especialmente cuando diferentes personas trabajan en diferentes twigs y luego desea ver de dónde se originó un set de cambios. Pero no quieres usarlo en tu situación.

Si usa la hg update --rev 38 , entonces los sets de cambios 39-45 quedarán como un callejón sin salida – una cabeza colgante como la llamamos. Recibirás una advertencia cuando presionas, ya que crearás "múltiples encabezados" en el repository al que presionas. La advertencia está allí ya que es una especie de descortesía dejar esas cabezas, ya que sugieren que alguien tiene que hacer una fusión. Pero en tu caso, puedes seguir adelante y hg push --force ya que realmente quieres dejarlo colgando.

Si aún no ha empujado la revisión 39-45 a otro lugar, puede mantenerla en privado. 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 presionar los nuevos (buenos) sets de cambios que cree. Todavía tendrá las revisiones antiguas (malas) en su clon foo . (Puedes cambiar el nombre de los clones como quieras, por ejemplo, foo to foo-bad y foo-38 foo ).

Finalmente, también puede usar hg revert --all --rev 38 y luego confirmar. Esto creará una revisión 46 que se ve 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 la hg update , pero por otro lado no obtendrá quejas acerca de tener múltiples cabezas. Utilizaría hg revert si estuviera queueborando con otros que ya han hecho su propio trabajo según la revisión 45. De lo contrario, la hg update es más explícita.

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

 hg revert path/to/file -r-2 

Ese -2 volverá a la versión anterior al último commit, usando -1 solo revertiría los cambios no confirmados actuales.

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

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

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

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

Primero tuve que hacer un cambio en cualquier file (por ejemplo, en un file README) para que Mercurial reconociera que hice un cambio nuevo, y luego podría confirmarlo.

Esto luego creó dos cabezas como se mencionó.

Para deshacerse de la otra cabeza antes de empujar, seguí el paso No-Op Merges para remediar esa situación.

Pude empujar.

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

hg revertir –todo –rev $ {1}

hg commit -m "Restableciendo la twig $ {1} como pnetworkingeterminado"

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

Esto es útil si necesita agregar una corrección urgente a una twig de versión, pero debe comstackr desde la pnetworkingeterminada (hasta que tengamos nuestras herramientas de CI correctas y podamos build desde las sucursales y luego eliminar las twigs de publicación también).

Instalaría Tortoise Hg (una GUI gratuita para Mercurial) y lo usaría. A continuación, puede hacer clic con el button derecho en una revisión a la que desee volver, con todos los posts de confirmación frente a sus ojos, y "Revertir todos los files". Lo hace intuitivo y fácil de rodar hacia atrás y hacia delante entre las versiones de un set de files, lo que puede ser realmente útil si está buscando establecer cuándo apareció un problema por primera vez.