svn - revertir - ¿Cómo vuelvo a una versión anterior de nuestro código en Subversion?
revertir cambios en svn (13)
Básicamente, debe "fusionar hacia atrás": aplique una diferencia entre la versión actual y la anterior a la versión actual (para que termine con una copia de trabajo que se parece a la versión anterior) y luego vuelva a confirmar. 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 .
Estoy trabajando en un proyecto con un amigo y quiero volver a una versión anterior de nuestro código y configurarlo 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 de confirmación, archivo o directorio no actualizado".
También tengo el cliente de subversion en mi PC.
Creo que esto es lo más adecuado:
Realice la fusión hacia atrás, por ejemplo, si el código confirmado contiene la revisión de la rev 5612 a la 5616, simplemente fusione hacia atrás. Funciona en mi final.
Por ejemplo:
svn merge -r 5616:5612 https://<your_svn_repository>/
Contendría un código fusionado de nuevo a la revisión anterior, luego podría cometerlo.
Esto es lo que hice y trabajé para mí.
Quiero deshacer los cambios en múltiples confirmaciones que hice en ciertos momentos y quiero ir al punto de confirmación anterior.
- Ir al equipo -> Mostrar historial.
- Haga clic con el botón derecho en el rango de revisiones que desee ignorar.
- Seleccione la opción "Revertir cambios".
Esto ejecutará una combinación inversa, deshaciendo los cambios en su copia de trabajo.
Solo revisa el código y confirma.
Haga clic con el botón derecho en la jerarquía más alta que desee revertir >> Revert
o Revert to Revision
Haga clic 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.
La forma estándar de usar la combinación para deshacer todo el check-in funciona muy bien, si eso es lo que quiere hacer. A veces, sin embargo, todo lo que desea hacer es revertir un solo archivo. No hay una forma legítima de hacerlo, pero hay un hack:
- Encuentra la versión que deseas usando svn log.
Utilice el subcomando de exportación de svn:
svn exportar http: // url-to-your-file @ 123 / tmp / filename
(Donde 123 es el número de revisión para una buena versión del archivo). Luego mueva o copie ese único archivo para sobrescribir el anterior. Comprueba el archivo modificado y listo.
La mayoría de las respuestas anteriores han estado utilizando una combinación inversa, y esa suele ser la respuesta correcta. Sin embargo, hay una situación (que me acaba de suceder) donde 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 puede deshacer fácilmente, ya sea cambiando los finales de línea y confirmando de nuevo, o mediante una combinación inversa, pero tiene el efecto de hacer que svn blame
list my edit como la fuente de cada línea del archivo. (Curiosamente, TortoiseSVN en Windows no se ve afectado por esto; solo la línea de comandos tiene la svn blame
).
Si desea mantener el historial como lo indica svn blame
, creo que debe hacer lo siguiente:
- Eliminar el archivo y cometer.
- En el repositorio, copie la copia correcta del archivo en la cabecera y confirme.
- Restaura cualquier edición que quieras mantener.
La eliminación asusta un poco, pero recuerda que siempre tienes 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 válida.
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.
La razón por la que no puede hacer nada directamente con la buena copia que tiene en su PC es que sus carpetas .svn saben que es un código del pasado, por lo que requiere una actualización. Pero solo se pueden realizar cambios al principio del historial de subversión.
Puedes usar
svn update -r <earlier_revision_number>
para revisar 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 (principal), luego aplique la combinación svn como se sugiere anteriormente.
Si realmente no puede encontrarlo, y necesita confirmar la copia en su PC, obtenga una nueva actualización a la última versión y copie su versión "buena" sobre la parte superior de la misma (¡ sin las carpetas .svn!). Elimine los archivos que no estaban en la copia correcta de las carpetas y de Subversion, y confirme lo que tiene ahora.
La respuesta de Jon Skeet es prácticamente la solución en pocas palabras, sin embargo, si eres como yo, tal vez quieras una explicación. El manual de Subversion llama a esto un
Cherry-Pick Merge
De las páginas del manual.
Esta forma se denomina fusión ''cherry-pick'': ''-r N: M'' se refiere a la diferencia en la historia de la rama fuente entre las revisiones N y M.
Se puede usar un ''rango inverso'' para deshacer los cambios. Por ejemplo, cuando el origen y el destino se refieren a la misma rama, una revisión previamente confirmada se puede "deshacer". En un rango inverso , N es mayor que M en ''-r N: M'', o la opción ''-c'' se usa con un número negativo: ''-c -M'' es equivalente a ''-r M:''. Deshacer cambios como este también se conoce como realizar una ''fusión inversa''.
Si la fuente es un archivo, entonces las diferencias se aplican a ese archivo (útil para la fusión inversa de cambios anteriores). De lo contrario, si la fuente es un directorio, entonces el destino se establece de forma predeterminada en ''.''
En el uso normal, la copia de trabajo debe estar actualizada, en una sola revisión, sin modificaciones locales y sin subárboles conmutados.
Ejemplo:
svn merge -r 2983:289 path/to/file
Esto reemplazará la copia local [2983] (que, según la cita anterior, debe estar sincronizada con el servidor, su responsabilidad) con la revisión 289 del servidor. El cambio se produce localmente, lo que significa que si tiene un proceso de pago limpio, los cambios se pueden inspeccionar antes de confirmarlos.
Lo siguiente me ha funcionado.
Tuve muchos cambios locales y tuve que descartarlos de la copia local y sacar la última versión estable en SVN.
Compruebe el estado de todos los archivos, incluidos los archivos ignorados.
Grep todas las líneas para obtener los archivos recién agregados e ignorados.
Reemplace aquellos con
//
.y rm -rf todas las lineas.
svn status --no-ignore | grep ''^ [? I]'' | sed "s / ^ [? I] //" | xargs -I {} rm -rf "{}"
Sincroniza con la versión anterior y confía. Esto debería funcionar.
Aquí también hay una explicación de deshacer los cambios.
Solo usa esta linea
svn update -r yourOldRevesion
Puedes conocer tu revisión actual usando:
svn info
Un poco más de la vieja escuela.
svn diff -r 150:140 > ../r140.patch
patch -p0 < ../r140.patch
entonces lo usual
svn diff
svn commit