version-control - ventajas - svn control de versiones
Mercurial-vuelve a la versión antigua y continúa desde allí (7)
Acabo de encontrar un caso en el que necesito revertir solo un archivo a la revisión anterior, justo después de haber realizado la confirmación y el envío. La sintaxis abreviada para especificar estas revisiones no está cubierta por las otras respuestas, así que aquí hay un comando para hacer eso.
hg revert path/to/file -r-2
Ese -2
volverá a la versión anterior al último compromiso, usar -1
simplemente revertiría los cambios actuales no confirmados.
Estoy usando Mercurial localmente para un proyecto (es el único repositorio que no se puede empujar / tirar hacia / desde cualquier 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 comenzar e implementarla de una manera diferente.
Estoy un poco confundido con los comandos branch
/ revert
/ update -C
en Mercurial. Básicamente, quiero volver a la versión 38 (actualmente en 45) y tener mis siguientes confirmaciones tener 38 como padre y continuar 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?
Aquí está la hoja de trucos en los comandos:
hg update
cambia su revisión principal de la copia de trabajo y también cambia el contenido del archivo 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 solo el contenido del archivo y deja solo la revisión principal de la copia de trabajo. Por lo general, usahg revert
cuando decide que no desea mantener los cambios no confirmados que ha realizado en un archivo en su copia de trabajo.hg branch
inicia una nueva rama nombrada. Piense en una rama nombrada como una etiqueta que asigna a los conjuntos de cambios. Entonces, si hacehg branch red
, los siguientes conjuntos de cambios se marcarán como pertenecientes a la rama "red". Esta puede ser una buena forma de organizar los conjuntos de cambios, especialmente cuando diferentes personas trabajan en diferentes sucursales y luego desea ver de dónde se originó un conjunto de cambios. Pero no quieres usarlo en tu situación.
Si usa hg update --rev 38
, entonces los conjuntos de cambios 39–45 se dejarán como un callejón sin salida, una cabeza colgando como lo llamamos. Recibirá una advertencia cuando presione, ya que estará creando "múltiples cabezas" en el repositorio al que presiona. La advertencia está ahí, ya que es un tanto descortés dejar esas cabezas alrededor, ya que sugieren que alguien necesita hacer una fusión. Pero en su caso, puede seguir adelante y hg push --force
ya que realmente quiere dejarlo colgado.
Si aún no ha introducido la revisión 39-45 en 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) cambios que cree. Aún tendrás las revisiones antiguas (malas) en tu clon de foo
. (Puedes cambiar el nombre de los clones como quieras, por ejemplo, foo
to foo-bad
y foo-38
to foo
).
Finalmente, también puede usar hg revert --all --rev 38
y luego commit. Esto creará una revisión 46 que parece idéntica a la revisión 38. Luego, continuará trabajando a partir de la revisión 46. Esto no creará una bifurcación en el historial de la misma manera explícita en que lo hizo hg update
, pero por otro lado no recibirá quejas. sobre tener múltiples cabezas. hg revert
si estuviera colaborando con otros que ya han realizado su propio trabajo en base a la revisión 45. De lo contrario, hg update
es más explícito.
Después de usar hg update -r REV
no estaba claro en la respuesta sobre cómo confirmar ese cambio para que luego pueda presionar.
Si solo intenta confirmar después de la actualización, Mercurial no cree que haya cambios.
Primero tuve que hacer un cambio en cualquier archivo (por ejemplo, en un archivo README), por lo que Mercurial reconoció que hice un nuevo cambio, luego pude hacerlo.
Esto luego creó dos cabezas como se mencionó.
Para deshacerme de la otra cabeza antes de empujar, seguí el paso de No-Op Merges para remediar esa situación.
Entonces pude empujar.
En mi humilde opinión, la hg strip -r 39
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 de recompra" 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.
Instalaría Tortoise Hg (una GUI gratuita para Mercurial) y utilizaría eso. A continuación, puede simplemente hacer clic derecho en una revisión a la que quiera volver, con todos los mensajes de confirmación delante de sus ojos, y "Revertir todos los archivos". Hace que sea intuitivo y fácil de avanzar y retroceder entre versiones de un conjunto de archivos, lo que puede ser realmente útil si está buscando establecer cuándo surgió un problema por primera vez.
Las respuestas anteriores fueron las más ú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 de bash, pero funcionan bien por si mismas si quieres hacerlo manualmente.
Esto es útil si necesita agregar un hotfix a una sucursal de lanzamiento, pero necesita compilar desde el valor predeterminado (hasta que obtengamos las herramientas de CI correctas y podamos construir desde las sucursales y luego eliminemos las sucursales de lanzamiento).
hg update [-r REV]
Si luego te comprometes, crearás una nueva rama. Luego, puede continuar trabajando solo en esta rama o eventualmente fusionar la existente en ella.