¿Mejor manera de volver a una revisión SVN anterior de un archivo?

167

Accidentalmente envié demasiados archivos a un repositorio SVN y cambié algunas cosas que no quería. (Suspiro). Para volver a su estado anterior, lo mejor que pude encontrar fue

svn rm l3toks.dtx
svn copy -r 854 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

Dios! ¿No hay mejor manera? ¿Por qué no puedo escribir algo como esto?

svn revert -r 854 l3toks.dtx

De acuerdo, solo estoy usando v1.4.4, pero hojeé la lista de cambios para la rama 1.5 y no pude ver nada directamente relacionado con esto. ¿Yo me perdí algo?


Editar: supongo que no estaba lo suficientemente claro. No creo que quiera fusión inversa, porque entonces voy a perder los cambios que hice quieren hacer! Diga eso fileAy fileBambos fueron modificados pero solo quería comprometerme fileA; escribiendo accidentalmente

svn commit -m "small change"

confirma ambos archivos, y ahora quiero retroceder fileB. La fusión inversa hace que esta tarea no sea más fácil (por lo que puedo decir) que los pasos que describí anteriormente.

Will Robertson
fuente
Posible duplicado de ¿Cómo revierto una confirmación SVN?
Vadzim

Respuestas:

243
svn merge -r 854:853 l3toks.dtx

o

svn merge -c -854 l3toks.dtx

Los dos comandos son equivalentes .

orip
fuente
55
Gracias por esto, solo quería decir algo: por ejemplo, estoy en la revisión 855, quiero revertir un archivo a la revisión 854. Si lo hago svn merge -c -854 my.file, y luego lo hago svn diff, parece mostrar una revisión antes de 854 (es decir, 853 ); solo cuando lo hago svm merge -c 854 myfile(sin el -), parece que mi archivo se revierte a rev 854. Gracias de nuevo, ¡salud!
sdaau el
11
¿Hay alguna razón por la cual la primera opción anterior funcionó como un encanto para mí, mientras que la segunda no funcionó en absoluto?
skybondsor
77
Sin embargo, no olvide comprometerse después de la fusión inversa. A menudo olvido :)
Vineeth Pradhan
11
Realmente debería menos 1 esto para no indicar cuál es la diferencia entre estos dos comandos. Mala respuesta
Angry Dan
44
@sprog: si hay una diferencia que agradecería saber
orip
34

Consulte la sección " deshacer cambios " del libro svn

luapyad
fuente
55
Se recomiendan enlaces a recursos externos, pero agregue contexto alrededor del enlace para que sus usuarios tengan una idea de qué es y por qué está allí. Siempre cite la parte más relevante de un enlace importante, en caso de que no se pueda acceder al sitio de destino o se desconecte permanentemente.
user2084795
32

lamento usar un poco de espacio solo para reiterar la respuesta dada anteriormente, pero esto es algo con lo que siempre termino en problemas.

Digamos que actualicé los archivos locales a la última revisión, que es 854. Luego, me gustaría obtener una revisión anterior: la versión del archivo de algunas revisiones anteriores, digamos la revisión 851.

Copiar funcionaría:

svn copy -r 851 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

.. sin embargo, no puedo molestarme grepping para la URL del repositorio :)

La actualización aparentemente podría funcionar:

svn up -r 851 ./l3toks.dtx

... sin embargo, también marca la copia local como "recién retirada", o más bien "igual que la revisión en línea" (es decir, en Tortoise / RabbitVCS obtienes una marca de verificación verde OK), lo que significa que no puedes hacerlo svn ci -m "rolled back to r 851": simplemente porque el local subversionEl ejecutable no notará ningún cambio local y no se molestará en cargar nada en el repositorio en línea.

Y, como ya se respondió, la fusión inversa funciona, pero en este caso, no se debe confiar en la sintaxis de acceso directo; pero específicamente declara:

svn merge -r HEAD:851 l3toks.dtx
--- Reverse-merging r854 through r852 into 'l3toks.dtx':
U    l3toks.dtx

Debo admitir que nunca entendería la frase " Fusión inversa de r854 a r852 en el archivo " que significa " Acabo de obtener r851 de su archivo y sobrescribí lo que tenía anteriormente localmente, y está marcado como diferente de la última revisión en línea, así que puedes volver a revisarlo en línea como una nueva revisión de " reversión ", pero supongo (y espero :) que eso es lo que hace :)

Después de esto, uno puede usar svn diffpara asegurarse rápidamente si recuperamos localmente la revisión correcta; y también, el archivo estará marcado con un signo de exclamación rojo en Tortoise / RabbitVCS (es decir, diferente de la última versión confirmada), por lo que svn ci -m "rolled back to r 851"puede ejecutarse esta vez.

Además, tenga en cuenta que si finalmente cambia de opinión después de la fusión inversa ( es decir, de todos modos quiere seguir trabajando en la última revisión HEAD, aquí 854) después de haber regresado a 851 localmente, pero aún no ha cometido la reversión ), no debe usarlo svn up, ya que simplemente dirá que ya está " en la revisión 854 "; utilizar en su lugar svn revert --recursive .o similar ...

¡Salud!

Ref: Cómo deshacer los cambios usando Subversion - Jacob Wright - Flex, AIR, PHP, etc.

EDITAR: ... y aparentemente, el mismo efecto que svn merge -r HEAD:851 l3toks.dtxse puede lograr con:

svn export -r 851 l3toks.dtx
A    l3toks.dtx
Export complete.
sdaau
fuente
2
SIEMPRE debe preferir svn export, ya que hace exactamente lo que desea: verifique un archivo en una revisión determinada, mientras que la fusión inversa también intentará fusionar sus cambios locales con la versión especificada, es una operación compleja y loca, que es propenso a errores si no te cuidas!
Falco
1
Tuve problemas con la fusión inversa. En lugar de averiguar por qué, simplemente intenté exportar y funcionó perfectamente. Recomiendo encarecidamente solo usar exportar. Puede usar --forcepara sobrescribir directorios. Solo recuerda que sobrescribirá cualquier cambio.
Nick
¡Muy buena explicación sobre lo que realmente está sucediendo! Utilizo AnkhSVN y TortoiseSVN con frecuencia, y no veo ningún lugar para usar svn export, ¿me estoy perdiendo algo o simplemente no está implementado en estas GUI?
Conrad
@Conrad, lo usas haciendo clic en "Exportar ..." en AnkhSVN y "Exportar" en TortoiseSVN desde el menú contextual de tu repositorio (clic derecho)
nitinr708
10

Recientemente tuve que volver a una revisión particular para depurar una versión anterior y esto funcionó como magia:

svn up -r 3340 (or what ever your desired revision number)

Tuve que resolver todos los conflictos usando la opción "tc" ya que no me importaban los cambios locales (marqué todo lo que me importaba antes de revertir)

Volver a la revisión de la cabeza también fue simple:

svn up
Igor
fuente
5

Lo que estás buscando se llama "fusión inversa". Debería consultar los documentos sobre la función de fusión en el libro SVN (como señala luapyad, o más precisamente el primer comentarista en esa publicación, señala). Si está utilizando Tortoise, también puede acceder a la vista de registro y hacer clic derecho y elegir "revertir los cambios de esta revisión" en la que cometió el error.

rmeador
fuente
4

La fusión inversa es exactamente lo que quieres (ver la respuesta de luapyad). Simplemente aplique la fusión al archivo comprometido erróneamente en lugar de todo el directorio.

Tom
fuente
4

Si solo desea deshacer el último registro, puede usar lo siguiente

svn merge -r head:prev l3toks.dtx

De esa manera, no tiene que buscar los números de versión actual y anterior.

Ken Russell
fuente
4

svn merge fusionará las revisiones, no las revertirá. es decir, si tiene alguna adición en su versión HEAD, combínela con una revisión anterior, entonces el cambio persistirá.

Utilizo svn cat y luego lo redirijo al archivo:

svn cat -r 851 l3toks.dtx > l3toks.dtx

Luego tiene el contenido 851 en ese archivo y puede volver a ingresarlo.

Dylan
fuente
3

Si usa el IDE de Eclipse con el complemento SVN , puede hacer lo siguiente:

  1. Haga clic con el botón derecho en los archivos que desea revertir (o en la carpeta en la que estaban contenidos, si los eliminó por error y desea volver a agregarlos)
  2. Seleccione " Equipo> Cambiar "
  3. Elija el botón de radion "Revisión" e ingrese el número de revisión al que desea volver. Haga clic en Aceptar
  4. Ir a la perspectiva Sincronizar
  5. Seleccione todos los archivos que desea revertir
  6. Haga clic derecho en la selección y haga " Anular y confirmar ... "

Esto revertirá los archivos a la revisión que desee. Solo tenga en cuenta que SVN verá los cambios como una nueva confirmación. Es decir, el cambio obtiene un nuevo número de revisión y no hay ningún vínculo entre la revisión anterior y la nueva. Debe especificar en los comentarios de confirmación que revierte esos archivos a una revisión específica.

ceiroa
fuente