¿Cómo revierto una confirmación SVN?

303

He encontrado varios ejemplos de cómo revertir una confirmación SVN como

svn merge -r [current_version]:[previous_version] [repository_url]

o

svn merge -c -[R] .

Pero ninguno de ellos parece funcionar. Probé esos comandos y verifiqué los archivos que se cambiaron a mano.

¿Cómo revierto un commit con el número de revisión 1944? ¿Cómo verifico que se haya realizado la reversión (sin mirar en el archivo real que se han revertido los cambios)?

Alex
fuente
16
¿Nunca aceptó una respuesta porque ninguno de ellos funcionó?
2rs2ts
44
Si desea una respuesta literal, use "svn merge -c -1944". Para verificar si funcionó: "svn diff"
John Sampson
¿Qué pasa si el caso? Tengo 1943 (buena confirmación), luego 1944 (mala confirmación), luego 1945 (buena confirmación), luego 1946 (buena confirmación). Ahora quiero eliminar solo 1944 (mala confirmación) y mantener todas las revisiones después de 1944, lo que significa que quiero un resultado como 1943,1945,1946 (eliminar solo 1944) de todas estas revisiones, ¿qué debo hacer?
Bhavin_m

Respuestas:

448

Ambos ejemplos deben funcionar, pero

svn merge -r UPREV:LOWREV . rango de deshacer

svn merge -c -REV . deshacer una sola revisión

en esta sintaxis: si el directorio actual es WC y (como se debe hacer después de cada fusión), confirmará los resultados

¿Quieres ver registros?

Tejón perezoso
fuente
99
@dwjohnston - sí, las fusiones siempre se realizan en WC y no es tarea del lado del servidor
Lazy Badger
14
svn: Merge source required. No dados.
2rs2ts
27
Parece que @ 2rs2ts olvidó el punto final para designar 'hacer esto en el directorio actual'.
Dalin
14
También puede hacer varias confirmaciones individuales al mismo tiempo:svn merge -c -42587,-42589 .
mlathe
1
@ahnbizcad - revisión (única), que desea deshacer
Lazy Badger
130

Si está utilizando el cliente TortoiseSVN , se hace fácilmente a través del cuadro de diálogo Mostrar registro .

dodgy_coder
fuente
55
Esta es, con mucho, la forma más fácil de hacerlo
Markku K.
55
Esto está desactualizado. Ya no hay un menú contextual disponible para el cliente en la versión actual.
user1789573
19
¿Qué? TortoiseSVN ES un menú contextual, además de los cuadros de diálogo que genera. ¿Qué quiere decir con "ya no hay un menú contextual"? ¡Sin duda lo hay!
Ben
@Ben Creo que el usuario1789573 se tropezó un poco por la mención explícita de "Menú contextual" en el tutorial vinculado a la respuesta.
Tom Catullo
2
En caso de que vea esto más tarde, está (todavía) allí. En la pantalla Mostrar registro, haga clic con el botón derecho en la revisión y aparecerá la opción "Volver a esta revisión". Esto está en TortoiseSVN 1.9.4 Build 27285. Lo acabo de usar y puedo decirte que funciona bien.
Bruce Van Horn
65

svn merge -r 1944:1943 .debería revertir los cambios de r1944 en su copia de trabajo. Luego puede revisar los cambios en su copia de trabajo (con diff), pero necesitaría confirmar para aplicar la reversión en el repositorio.

onon15
fuente
44
No funciona, requiere fuente de fusión. Intenté en svn merge -r 1944:1943 .cambio, pero nada ha cambiado.
Alex
¿Ha avanzado el repositorio desde r1944? Si es así, ¿hay cambios conflictivos en las mismas líneas que los cambios entre r1943 y r1944?
onon15
Estoy en la revisión de 1945 y no parece haber un conflicto. Ni svn statusni svn diffda nada.
Alex
77
Error:svn: Try 'svn help' for more info svn: Merge source required
Alex
55
Pero svn merge -r 1945:1943 .parece haber funcionado. Creo que entiendo: debe fusionar la versión de 'antes' de la confirmación 'mala' en su repositorio de trabajo. Esto está bien cuando quieres hacer una simple "reversión" de la confirmación anterior. Pero, ¿qué sucede si desea revertir los cambios realizados con la versión 1900?
Alex
45

Primero, revierta la copia de trabajo a 1943.

> svn merge -c -1943 .

En segundo lugar, verifique qué se va a cometer.

> svn status

Tercero, comprometer la versión 1945.

> svn commit -m "Fix bad commit."

Cuarto, mira el nuevo registro.

> svn log -l 4

------------------------------------------------------------------------
1945 | myname | 2015-04-20 19:20:51 -0700 (Mon, 20 Apr 2015) | 1 line

Fix bad commit.
------------------------------------------------------------------------
1944 | myname | 2015-04-20 19:09:58 -0700 (Mon, 20 Apr 2015) | 1 line

This is the bad commit that I made.
------------------------------------------------------------------------
1943 | myname | 2015-04-20 18:36:45 -0700 (Mon, 20 Apr 2015) | 1 line

This was a good commit.
------------------------------------------------------------------------
Shaun Luttin
fuente
1
¿Qué pasa si el caso? Tengo 1943 (buena confirmación), luego 1944 (mala confirmación), luego 1945 (buena confirmación), luego 1946 (buena confirmación). Ahora quiero eliminar solo 1944 (mala confirmación) y mantener todas las revisiones después de 1944, lo que significa que quiero un resultado como 1943,1945,1946 (eliminar solo 1944) de todas estas revisiones, ¿qué debo hacer?
Bhavin_m
26

Es imposible "cancelar" una revisión, pero puede revertir su copia de trabajo a la versión 1943 y confirmarla como la versión 1945. Las versiones 1943 y 1945 serán idénticas, revertiendo efectivamente los cambios.

Jakub Zaverka
fuente
18
Solo para ser molestamente exacto, quisiera comentar que si tiene acceso de administrador al repositorio, puede "cancelar". Esto mediante la creación de un repositorio de clones hasta una revisión dada usando svn dumpy luego svn load. Pero, por supuesto, esto no debe usarse en circunstancias normales.
onon15
44
No quiero deshacerme, quiero crear un nuevo número de compromiso con un cierto compromiso invertido. Los conjuntos dicen que he revisado la versión 1944, hice un commit en 1945, que quiero 'revertir'. Entonces quiero tener una versión 1946, cuyos archivos son idénticos a los de la versión 1944. (Excepto la historia, por supuesto). Pero la pregunta sigue siendo: ¿Cómo hacer eso? ¿Cuáles son los comandos?
Alex
//, @Alex, también estoy interesado en esto, especialmente en algo análogo a $ git revert. Me resultó algo difícil aprender SVN después de usar Git durante tanto tiempo.
Nathan Basanese
10

Lo siguiente hará una carrera en seco, como dice. HEAD es la versión actual, PREV es anterior, luego la ruta a su archivo o elemento confirmado:

svn merge --dry-run -rHEAD:PREV https://example.com/svn/myproject/trunk

Si la ejecución en seco se ve bien, ejecute el comando sin --dry-run

Verifique el cambio en la revisión y vuelva a confirmar. Para buscar números de versión, intente:

svn log
BentheFolker
fuente
4
F=code.c
REV=123
svn diff -c $REV $F | patch -R -p0 \
    && svn commit -m "undid rev $REV" $F
jmullee
fuente
¿Requiere esto que la copia local sea diferente de la mala revisión?
Eliezer Miron
2

Alex, prueba esto: svn merge [WorkingFolderPath] -r 1944: 1943

Nikita
fuente
2

Si bien las sugerencias dadas ya pueden funcionar para algunas personas, no funciona para mi caso. Al realizar la fusión, los usuarios en los rev 1443que se actualiza rev 1445, aún sincronizan todos los archivos modificados 1444aunque sean iguales a los 1443de la fusión. Necesitaba que los usuarios finales no vieran la actualización en absoluto.

Si desea ocultar completamente la confirmación, es posible creando una nueva rama en la revisión correcta y luego intercambiando las ramas. Lo único es que necesita eliminar y volver a agregar todos los bloqueos.

copy -r 1443 file:///<your_branch> file:///<your_branch_at_correct_rev>
svn move file:///<your_branch> file:///<backup_branch>
svn move file:///<your_branch_at_correct_rev> file:///<your_branch>

Esto funcionó para mí, tal vez sea útil para alguien más por ahí =)

droxxodia
fuente
2
svn merge -c -M PATH

Esto me salvó la vida.

Estaba teniendo el mismo problema, después de volver atrás también no veía el código antiguo. Después de ejecutar el comando anterior, obtuve un código de versión anterior limpio.

amit ghosh
fuente
1

Intenté lo anterior, ( svn merge) y tienes razón, hace jack. sin embargo

svn update -r <revision> <target> [-R]

parece funcionar, pero no es permanente (mi svn simplemente muestra una revisión anterior). Entonces tuve que

mv <target> <target backup>
svn update <target>
mv <target backup> <target>
svn commit -m "Reverted commit on <target>" <target>

En mi caso particular, mi objetivo es interfaces/AngelInterface.php. Hice cambios en el archivo, los comprometí, actualicé la computadora de compilación ejecuté el compilador phpdoc y descubrí que mis cambios eran una pérdida de tiempo. svn log interfaces/AngelInterface.phpmuestra mi cambio como r22060 y la confirmación anterior en ese archivo fue r22059. Entonces puedo svn update -r 22059 interfaces/AngelInterface.phpy termino con el código como estaba en -r22059 nuevamente. Luego :-

mv interfaces/AngelInterface.php interfaces/AngelInterface.php~
svn update interfaces/AngelInterface.php
mv interfaces/AngelInterface.php~ interfaces/AngelInterface.php
svn commit -m "reverted -r22060" interfaces/AngelInterface.php

Alternativamente, podría hacer lo mismo en un directorio, especificando . -Ren lugar de interfaces/AngelInterface.phptodo lo anterior.

sibaz
fuente
1
Otra cosa, como ya se dijo, lo que no puede hacer es eliminar el commit del historial, como puede hacer en git pirateando directamente a los árbitros. Todo lo que puede hacer es usar el repositorio para cambiar su fuente a la forma en que lo desea, y confirmarlo como un cambio.
sibaz
Después de investigar más a fondo, puedo ver que es posible eliminar el commit del historial usando svnadmin, pero se recomienda encarecidamente que no lo haga. Ver stackoverflow.com/questions/5566327/…
sibaz
0

Si desea eliminar por completo las confirmaciones del historial, también puede hacer un volcado del repositorio en una revisión específica, luego importar ese volcado. Específicamente:

svnrdump dump -r 1:<rev> <url> > filename.dump

El comando svnrdump realiza la misma función que svnadmin dump pero funciona en un repositorio remoto.

A continuación, solo importe el archivo de volcado en el repositorio de su elección. Esto fue probado para funcionar bien en Beanstalk.

redcalfee
fuente