Cara yang lebih baik untuk kembali ke revisi SVN file sebelumnya?

167

Saya tidak sengaja melakukan terlalu banyak file ke repositori SVN dan mengubah beberapa hal yang tidak saya maksud. (Menghela napas.) Untuk mengembalikan mereka ke keadaan semula, yang terbaik yang bisa saya lakukan adalah

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

Astaga! Apakah tidak ada cara yang lebih baik? Mengapa saya tidak bisa menulis sesuatu seperti ini:

svn revert -r 854 l3toks.dtx

Oke, saya hanya menggunakan v1.4.4, tapi saya membaca sekilas daftar perubahan untuk cabang 1.5 dan saya tidak bisa melihat apa pun yang berhubungan langsung dengan ini. Apakah saya melewatkan sesuatu?


Sunting: Saya kira saya tidak cukup jelas. Saya tidak berpikir saya ingin membalikkan merge, karena saya akan kehilangan perubahan yang saya lakukan ingin membuat! Katakan itu fileAdan fileBkeduanya dimodifikasi tetapi saya hanya ingin melakukan fileA; tidak sengaja mengetik

svn commit -m "small change"

melakukan kedua file, dan sekarang saya ingin memutar kembali fileB. Membalikkan penggabungan membuat tugas ini tidak lebih mudah (sejauh yang saya tahu) daripada langkah-langkah yang saya uraikan di atas.

Will Robertson
sumber
Kemungkinan duplikat dari Bagaimana cara mengembalikan komit SVN?
Vadzim

Jawaban:

243
svn merge -r 854:853 l3toks.dtx

atau

svn merge -c -854 l3toks.dtx

Kedua perintah itu setara .

orip
sumber
5
Terima kasih untuk ini, hanya ingin menyatakan sesuatu - katakanlah, saya pada revisi 855, saya ingin mengembalikan file ke revisi 854. Jika saya lakukan svn merge -c -854 my.file, dan kemudian lakukan svn diff, tampaknya akan menampilkan satu revisi sebelum 854 (yaitu, 853 ); hanya ketika saya melakukannya svm merge -c 854 myfile(tanpa -), sepertinya myfile dikembalikan ke rev 854. Terima kasih lagi, tepuk tangan!
sdaau
11
Apakah ada alasan mengapa opsi pertama di atas bekerja seperti pesona bagi saya sementara yang kedua tidak berfungsi sama sekali?
skybondsor
7
Namun, jangan lupa komit setelah penggabungan terbalik. Saya sering lupa :)
Vineeth Pradhan
11
Benar-benar harus dikurangi 1 ini karena tidak menyatakan apa perbedaan antara kedua perintah ini. Jawaban yang buruk
Angry Dan
4
@sprog - jika ada perbedaan, saya akan menghargai mengetahui
orip
34

Lihatlah bagian " membatalkan perubahan " dari buku svn

luapyad
sumber
5
Tautan ke sumber daya eksternal dianjurkan, tetapi tolong tambahkan konteks di sekitar tautan sehingga sesama pengguna Anda akan mengetahui apa itu dan mengapa ada di sana. Selalu kutip bagian yang paling relevan dari tautan penting, jika situs target tidak dapat dijangkau atau offline secara permanen.
user2084795
32

maaf menggunakan beberapa ruang hanya pada pengulangan dari jawaban yang diberikan sebelumnya - tapi ini adalah sesuatu yang selalu berakhir dengan masalah.

Katakanlah saya telah memperbarui file lokal ke revisi terbaru, yaitu 854. Lalu, saya ingin mendapatkan revisi yang lebih lama - versi file dari beberapa revisi sebelumnya, katakan revisi 851.

Salin akan berfungsi:

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

.. Namun, saya tidak dapat diganggu grepping untuk URL repo :)

Pembaruan yang tampaknya berfungsi:

svn up -r 851 ./l3toks.dtx

... namun, ini juga menandai salinan lokal sebagai "baru diperiksa", atau lebih tepatnya "sama dengan revisi online" (yaitu di Tortoise / RabbitVCS Anda mendapatkan tanda centang OK hijau) - yang berarti Anda tidak dapat melakukan svn ci -m "rolled back to r 851": hanya karena lokal subversiondieksekusi tidak akan melihat perubahan lokal, dan tidak akan repot untuk mengunggah apa pun ke repositori online.

Dan, seperti yang sudah dijawab, membalikkan penggabungan berfungsi - tetapi dalam kasus ini, orang seharusnya tidak mengandalkan sintaks pintasan; tetapi secara khusus nyatakan:

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

Harus saya akui - saya tidak akan pernah mengerti kalimat " Membalikkan r854 melalui r852 ke dalam file " berarti " Baru saja mendapatkan r851 dari file Anda, dan menimpa apa pun yang sebelumnya Anda miliki secara lokal - dan ditandai sebagai berbeda dari revisi online terbaru, jadi Anda dapat memeriksanya kembali secara online sebagai revisi 'rollback' baru ", tapi saya kira (dan harap :)) itulah fungsinya :)

Setelah ini, seseorang dapat menggunakan svn diffuntuk memastikan dengan cepat jika kami mendapatkan revisi yang tepat secara lokal; dan juga, file tersebut akan ditandai dengan tanda seru merah di Tortoise / RabbitVCS (yaitu, berbeda dari versi terbaru yang dilakukan), dan svn ci -m "rolled back to r 851"dapat dijalankan saat ini.

Juga, perhatikan bahwa jika Anda, akhirnya, berubah pikiran setelah penggabungan terbalik ( yaitu Anda ingin tetap bekerja pada revisi terbaru, HEAD, di sini 854 - setelah Anda kembali ke 851 secara lokal, tetapi belum melakukan rollback ), Anda tidak boleh menggunakan svn up, karena itu hanya akan mengatakan bahwa itu sudah " Pada revisi 854 "; gunakan sebagai gantinya svn revert --recursive .atau serupa ...

Bersulang!

Ref: Cara Roll Back Changes menggunakan Subversion - Jacob Wright - Flex, AIR, PHP, dll.

EDIT: ... dan ternyata, efek yang persis sama dengan svn merge -r HEAD:851 l3toks.dtx, dapat dicapai dengan:

svn export -r 851 l3toks.dtx
A    l3toks.dtx
Export complete.
sdaau
sumber
2
Anda harus SELALU lebih suka ekspor svn, karena ia melakukan persis apa yang Anda inginkan - periksa File dalam revisi tertentu, sementara membalikkan Penggabungan juga akan mencoba dan menggabungkan perubahan lokal Anda dengan versi yang ditentukan, ini adalah operasi yang kompleks dan gila, yang merupakan rawan kesalahan jika Anda tidak hati-hati!
Falco
1
Saya punya masalah dengan penggabungan terbalik. Daripada mencari tahu mengapa, saya hanya mencoba ekspor dan itu bekerja dengan sempurna. Saya sangat merekomendasikan hanya menggunakan ekspor. Anda dapat menggunakannya --forceuntuk menimpa direktori. Ingat saja itu akan menimpa perubahan apa pun.
Nick
Penjelasan yang sangat bagus tentang apa yang sebenarnya terjadi! Saya sering menggunakan AnkhSVN dan TortoiseSVN, dan saya tidak melihat ada tempat untuk memanfaatkan svn export- apakah saya kehilangan sesuatu atau apakah itu tidak diterapkan dalam GUI ini?
Conrad
@Conrad, Anda menggunakannya dengan mengklik "Ekspor ..." di AnkhSVN dan "Ekspor" di TortoiseSVN dari menu konteks repositori Anda (klik kanan)
nitinr708
10

Baru-baru ini saya harus kembali ke revisi tertentu untuk men-debug bangunan yang lebih tua dan ini berfungsi seperti sulap:

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

Saya harus menyelesaikan semua konflik menggunakan opsi "tc" karena saya tidak peduli dengan perubahan lokal (memeriksa semua yang saya pedulikan sebelum kembali)

Untuk kembali ke kepala revisi juga sederhana:

svn up
Igor
sumber
5

Apa yang Anda cari disebut "reverse merger". Anda harus berkonsultasi dengan dokumen tentang fungsi penggabungan dalam buku SVN (seperti luapyad, atau lebih tepatnya komentator pertama pada posting itu, tunjukkan). Jika Anda menggunakan Tortoise, Anda juga bisa langsung masuk ke tampilan log dan klik kanan dan pilih "kembalikan perubahan dari revisi ini" pada salah satu tempat Anda melakukan kesalahan.

rmeador
sumber
4

Reverse gabung adalah persis apa yang Anda inginkan (lihat jawaban luapyad). Cukup terapkan gabungan ke file yang dikomit secara salah alih-alih seluruh direktori.

Tom
sumber
4

Jika Anda hanya ingin membatalkan checkin terakhir, Anda dapat menggunakan yang berikut ini

svn merge -r head:prev l3toks.dtx

Dengan begitu, Anda tidak perlu mencari nomor versi saat ini dan sebelumnya.

Ken Russell
sumber
4

svn menggabungkan akan menggabungkan revisi, bukan mengembalikannya. yaitu jika Anda memiliki beberapa tambahan dalam versi HEAD Anda kemudian menggabungkannya dengan revisi sebelumnya, maka perubahan akan tetap ada.

Saya menggunakan svn cat kemudian mengarahkannya ke file:

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

Kemudian Anda memiliki konten 851 dalam file itu dan dapat memeriksanya kembali.

Dylan
sumber
3

Jika Anda menggunakan Eclipse IDE dengan plugin SVN, Anda dapat melakukannya sebagai berikut:

  1. Klik kanan file yang ingin Anda kembalikan (atau folder tempat penyimpanannya, jika Anda menghapusnya secara tidak sengaja dan Anda ingin menambahkannya kembali)
  2. Pilih " Tim> Ganti "
  3. Pilih tombol radion "Revisi", dan masukkan nomor revisi yang ingin Anda kembalikan. Klik OK
  4. Pergi ke perspektif Sinkronisasi
  5. Pilih semua file yang ingin Anda kembalikan
  6. Klik kanan pada pilihan dan lakukan " Override and Commit ... "

Ini akan mengembalikan file ke revisi yang Anda inginkan. Perlu diingat bahwa SVN akan melihat perubahan sebagai komit baru. Artinya, perubahan mendapat nomor revisi baru, dan tidak ada tautan antara revisi lama dan yang baru. Anda harus menentukan dalam komentar komit bahwa Anda mengembalikan file-file itu ke revisi tertentu.

ceiroa
sumber