¿Cómo puedo volver a una versión anterior de nuestro código en Subversion?


Estoy trabajando en un proyecto con un amigo y quiero volver a una versión anterior de nuestro código y configurarla para que sea la actual. ¿Cómo lo hago?

Estoy usando "anksvn" en vs08.

Tengo la versión que quiero en mi PC, pero la confirmación está fallando; El mensaje que recibo es "error en la confirmación, archivo o directorio está desactualizado."

También tengo el cliente subversion en mi PC.

 445
Author: Chen Kinnrot, 2009-05-02

13 answers

Básicamente necesitas "fusionar hacia atrás" - aplicar una diferencia entre la versión actual y la anterior a la versión actual (por lo que terminas con una copia de trabajo que se parece a la versión anterior) y luego confirmar de nuevo. Así, por ejemplo, para pasar de la revisión 150 (actual) a la revisión 140:

svn update
svn merge -r 150:140 .
svn commit -m "Rolled back to r140"

El Libro Rojo de Subversion tiene una buena sección sobre esto.

 715
Author: Jon Skeet,
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
2015-05-08 11:54:40

La razón por la que no puedes hacer nada directamente con la buena copia que tienes en tu PC, es que es .las carpetas svn saben que es código del pasado, por lo que requiere una actualización. Pero solo se pueden realizar cambios a la cabeza de la historia de subversion.

Puede usar

svn update -r <earlier_revision_number>

Para comprobar varias versiones anteriores de su proyecto, hasta que encuentre el número de revisión correcto, de su buena versión. Cuando lo haya encontrado, actualice a la revisión más reciente (head), luego aplique el svn merge como se sugirió anteriormente.

Si realmente no puede encontrarlo, y necesita para confirmar la copia en su PC, entonces obtenga una nueva actualización a la última versión, y copie su versión "buena" sobre la parte superior de la misma (sin el .carpetas svn!). Elimine cualquier archivo que no estuviera en la copia correcta de las carpetas y de subversion, y confirme lo que tiene ahora.

 168
Author: joeytwiddle,
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
2009-05-02 09:43:51

Simplemente use esta línea

Svn update-r yourOldRevesion

Puedes conocer tu revisión actual usando:

Svn info

 33
Author: M.Othman,
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-12-12 20:03:24

La forma estándar de usar merge para deshacer todo el check-in funciona muy bien, si eso es lo que quieres hacer. A veces, sin embargo, todo lo que desea hacer es revertir un solo archivo. No hay una manera legítima de hacer eso, pero hay un hack:

  1. Encuentre la versión que desea usando svn log.
  2. Utilice el subcomando de exportación de svn:

    Svn export http://url-to-your-file@123 / tmp / filename

(Donde 123 es el número de revisión para una buena versión del file.) Luego mueva o copie ese único archivo para sobrescribir el anterior. Compruebe en el archivo modificado y listo.

 26
Author: Bill,
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
2009-07-02 20:39:44

Un poco más de la vieja escuela

svn diff -r 150:140 > ../r140.patch
patch -p0 < ../r140.patch

Entonces lo habitual

svn diff
svn commit
 8
Author: Yauhen Yakimovich,
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-09-02 10:53:15

Creo que esto es lo más adecuado:

Hacer la fusión hacia atrás, por ejemplo, si el código confirmado contiene la revisión de rev 5612 a 5616, simplemente fusionarlo hacia atrás. Funciona por mi parte.

Por ejemplo:

svn merge -r 5616:5612 https://<your_svn_repository>/

Contendría un código fusionado de vuelta a la revisión anterior, luego podría confirmarlo.

 5
Author: hpal,
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-06-20 16:00:33

Esto es lo que hice y trabajé para mí.

Quiero deshacer los cambios en varias confirmaciones que hice en ciertas ocasiones y quiero ir al punto de confirmación anterior.

  1. Vaya a Equipo -> Mostrar historial.
  2. Haga clic con el botón derecho en el rango de revisiones que desea ignorar.
  3. Seleccione la opción "Revertir cambios".

Esto ejecutará una fusión inversa, deshaciendo los cambios en su copia de trabajo.

Simplemente revise el código y confirme.

 3
Author: Ziya,
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
2014-02-28 20:08:13

Haga clic con el botón derecho en la jerarquía más alta que desea revertir > > Revert o Revert to Revision

 2
Author: Yuval Adam,
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
2009-05-02 08:40:04

Haga clic con el botón derecho en el proyecto > Reemplazar Con > Revisión o URL > Seleccione la revisión específica que desea revertir.

Ahora confirme la versión del código de actualización local en el repositorio. Esto revertirá el código base a la revisión específica.

 1
Author: KayV,
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-06 13:11:08

La mayoría de las respuestas anteriores han estado usando una fusión inversa, y esa suele ser la respuesta correcta. Sin embargo, hay una situación (que me acaba de pasar) en la que no lo es.

Accidentalmente cambié un archivo con finales de línea Unix a finales de línea DOS al hacer un pequeño cambio, y lo confirmé. Esto se deshace fácilmente, ya sea cambiando los finales de línea y confirmando de nuevo, o mediante una fusión inversa, pero tiene el efecto de hacer que svn blame enumere mi edición como la fuente de cada línea de archivo. (Curiosamente, TortoiseSVN en Windows no se ve afectado por esto; solo la línea de comandos svn blame.)

Si desea mantener el historial según lo informado por svn blame, creo que debe hacer lo siguiente:

  • Elimine el archivo y confirme.
  • En el repositorio, copie la copia correcta anterior del archivo en el head, y confirme.
  • Restaura cualquier edición que quieras mantener.

La eliminación es un poco aterradora, pero recuerde que siempre tiene el archivo guardado en el repositorio, por lo que restaurarlo no es un gran problema. Aquí hay un código para ilustrar los pasos. Supongamos que xxx es el número de revisión de la última copia buena.

svn rm svn+ssh://path/to/file
svn copy svn+ssh://path/to/file@xxx svn+ssh://path/to -m"Restore good copy"
svn update
<restore the edits>
svn commit -m"Restore edits"

Tenga en cuenta que para una copia en el repositorio, el destino debe ser un directorio, no un nombre de archivo.

 1
Author: user2554330,
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-05-24 12:48:18

Sincronizar con la versión anterior y confirmarlo. Esto debería hacer el truco.

Aquí está también una explicación de deshacer cambios.

 0
Author: Mork0075,
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
2015-05-08 11:55:49

La respuesta de Jon Skeet es más o menos la solución en pocas palabras, sin embargo, si usted es como yo, es posible que desee una explicación. El manual de Subversion llama a esto un

Cherry-Pick Merge

De las páginas de manual.

  1. Esta forma se llama una combinación' cherry-pick': '- r N: M ' se refiere a la diferencia en la historia de la rama fuente entre revisiones N y M.

    Se puede usar un 'rango inverso' para deshacer los cambios. Por ejemplo, cuando fuente y target se refiere a la misma rama, una rama previamente la revisión se puede deshacer. En un rango inverso , N es mayor que M en '- r N: M', o la opción '-c' se utiliza con un número negativo: '- c-M' es equivalente a '-r M:'. Deshacer cambios como este también es conocido como realizar una 'fusión inversa'.


  • Si la fuente es un archivo, entonces las diferencias se aplican a eso archivo (útil para la fusión inversa de cambios anteriores). De lo contrario, si el origen es un directorio, el destino por defecto es '.'.

    En el uso normal, la copia de trabajo debe estar actualizada, a una sola revisión, sin modificaciones locales y sin subárboles cambiados.

Ejemplo:

svn merge -r 2983:289 path/to/file

Esto reemplazará la copia local[2983] (que, según la cita anterior, debería estar sincronizada con el servidor responsibility su responsabilidad) con la revisión 289 del servidor. El cambio ocurre localmente, lo que significa si tienes un checkout limpio, entonces los cambios pueden ser inspeccionados antes de confirmarlos.

 0
Author: Jonathan Komar,
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-05-23 11:16:20

Lo siguiente ha funcionado para mí.

Tuve muchos cambios locales y necesitaba descartarlos en la copia local y revisar la última versión estable en SVN.

  1. Compruebe el estado de todos los archivos, incluidos los archivos ignorados.

  2. Grep todas las líneas para obtener los archivos recién añadidos e ignorados.

  3. Sustitúyalos por //.

  4. Y rm-rf todas las líneas.

    Svn status no no-ignore / grep' ^[?I]' | sed "s/^[?Me] //" | xargs-I{} rm-rf "{} "

 -1
Author: shah1988,
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-12-12 20:28:19