Bagaimana cara saya kembali ke versi kode kami yang lebih lama di Subversion?

486

Saya sedang mengerjakan proyek dengan seorang teman dan saya ingin kembali ke versi yang lebih lama dari kode kami dan menjadikannya sebagai yang sekarang. Bagaimana saya melakukannya?

Saya menggunakan "anksvn" di vs08.

Saya memiliki versi yang saya inginkan di PC saya, tetapi komit gagal; Pesan yang saya dapatkan adalah "komit gagal, file atau direktori kedaluwarsa."

Saya juga punya klien subversi di PC saya.

Chen Kinnrot
sumber

Jawaban:

783

Pada dasarnya Anda perlu "menggabungkan ke belakang" - terapkan perbedaan antara versi saat ini dan sebelumnya ke versi saat ini (sehingga Anda berakhir dengan salinan yang berfungsi seperti versi lama) dan kemudian komit kembali. Jadi misalnya untuk beralih dari revisi 150 (sekarang) kembali ke revisi 140:

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

Buku Merah Subversion memiliki bagian yang bagus tentang ini .

Jon Skeet
sumber
3
tetapi penggabungan tidak mengesampingkan perubahan saya dan revisi baru.
Chen Kinnrot
76
Jika Anda menggunakan TortoiseSVN, klik kanan file pilih Gabung, lalu Gabungkan Berbagai Revisi. Di kotak log ketik 140-150 dan klik Kotak Centang Balik. Setelah itu, komit seperti biasa. Ini akan melakukan operasi yang sama dengan contoh Jon.
DavGarcia
8
Dengan gerhana dan subclipse, Anda dapat mengklik kanan proyek Anda, Tim / Tampilkan Riwayat, lalu pilih kemudian revisi yang ingin Anda "batalkan" dan dengan klik kanan lain pilih "Kembalikan perubahan dari Revisi yang Dipilih".
fego
36
Untuk kembali dari revisi kepala, Anda juga dapat menulis svn merge -r HEAD:140.
sschmeck
3
Instruksi TortoiseSVN @ DavGarcia tidak cocok untuk saya, setidaknya untuk tidak mengembalikan semua file dalam revisi (menggunakan TortoiseSVN 1.8.8). Klik kanan pada folder, pilih TortoisSVN-> Tampilkan log. Pilih revisi yang ingin Anda kembalikan, klik kanan sebagai mengatakan "Kembalikan perubahan dari revisi ini". Komit perubahan.
mhenry1384
178

Anda hanya dapat melakukan perubahan baru di kepala riwayat subversi.

Alasan Anda tidak dapat melakukan apa pun secara langsung dengan salinan baik yang Anda miliki di PC Anda, adalah karena .svnfoldernya mengetahui bahwa itu adalah kode dari masa lalu, sehingga memerlukan pembaruan sebelum melakukan apa pun.

Temukan nomor revisi yang baik dan kembalikan

  1. Temukan nomor revisi dari salinan lama yang Anda inginkan.

    Dapatkan revisi Anda saat ini dengan:

    svn info --show-item revision
    # or
    svn log

    Atau untuk memeriksa versi proyek Anda yang lebih lama , gunakan:

    svn update -r <earlier_revision_number>

    hingga Anda menemukan nomor revisi yang tepat.

  2. Catat angka revisi yang baik (dengan asumsi 123untuk contoh di bawah).

  3. Perbarui ke revisi terbaru:

    svn update
  4. Batalkan semua perubahan antara revisi yang Anda inginkan dan versi terbaru:

    svn merge -r HEAD:123 .
    svn commit "Reverted to revision 123"

    (sama dengan jawaban Jon Skeet di atas.)

Jika Anda tidak dapat menemukan nomor revisi

Jika Anda tidak dapat menemukan salinan lama, dan Anda hanya ingin mengkomit file-file saat ini di PC Anda:

  1. Buat salinan versi bagus Anda (tetapi tanpa .svnfolder apa pun ):

    cd ..
    rsync -ai --exclude=.svn  project/  project-good/
  2. Sekarang pastikan Anda memiliki versi terbaru:

    cd project
    svn update
    # or make a fresh checkout
    svn checkout <url>
  3. Salin versi bagus Anda dari atas copy pekerjaan.

    Perintah ini akan menyalin, dan juga menghapus file apa pun dari pohon kerja yang tidak ada dalam salinan baik Anda, tetapi tidak akan memengaruhi .svnfolder yang ada .

    cd ..
    rsync -ai --exclude=.svn --delete  project-good/  project/

    Jika Anda tidak memiliki rsync, Anda dapat menggunakan cp -atetapi Anda juga harus menghapus file yang tidak diinginkan secara manual.

  4. Anda harus dapat melakukan apa yang Anda miliki sekarang.

    cd project
    svn commit "Reverted to good copy"
joeytwiddle
sumber
2
svn tidak menafsirkannya sebagai modifikasi, saya tidak bisa melakukan itu.
Sandburg
svn menggabungkan -r KEPALA: 12345. adalah perintah yang benar untuk mengembalikan, jangan lakukan pembaruan -r. Anda orang gila.
Burung hantu
Saya kira jawaban ini dibatalkan oleh orang-orang yang tidak dapat menemukan nomor revisi mereka, atau yang menghargai penjelasan utama. Saya telah memperbarui jawabannya sekarang untuk memasukkan kedua pendekatan.
joeytwiddle
36

Cukup gunakan baris ini

svn perbarui -r yourOldRevesion

Anda dapat mengetahui revisi Anda saat ini dengan menggunakan:

info svn

M.Othman
sumber
15
Ini tidak menyelesaikan masalah. Sebaliknya, ini menghasilkan keadaan si penanya pada saat mengajukan pertanyaan mereka.
Ingo Schalk-Schupp
1
Jika Anda kurang beruntung untuk mengikuti saran ini, jalankan: "svn resolve --accept working -R."
Burung hantu
27

Cara standar menggunakan penggabungan untuk membatalkan seluruh proses masuk sangat bagus, jika itu yang ingin Anda lakukan. Namun, terkadang, yang ingin Anda lakukan hanyalah mengembalikan satu file. Tidak ada cara yang sah untuk melakukan itu, tetapi ada peretasan:

  1. Temukan versi yang Anda inginkan menggunakan svn log.
  2. Gunakan sub-perintah ekspor svn:

    svn ekspor http: // url-ke-file-Anda @ 123 / tmp / nama file

(Di mana 123 adalah nomor revisi untuk versi file yang baik.) Kemudian pindahkan atau salin file tunggal itu untuk menimpa yang lama. Periksa di file yang dimodifikasi dan Anda selesai.

Tagihan
sumber
Menggunakan Tortoise-svn saya bisa mengklik kanan pada satu file dan menggabungkannya. Haruskah ada cara untuk melakukan ini menggunakan svnjuga?
lc.
10
svn cat -r 123 path-in-your-working-copy > path-in-your-working-copy
dash17291
8

Sedikit lebih tua

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

lalu yang biasa

svn diff
svn commit
Yauhen Yakimovich
sumber
5

Saya pikir ini yang paling cocok:

Lakukan penggabungan ke belakang, misalnya, jika kode yang dikomit berisi revisi dari rev 5612 ke 5616, hanya menggabungkannya mundur. Ini bekerja pada akhirnya.

Contohnya:

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

Ini akan berisi kode yang digabungkan kembali ke revisi sebelumnya, maka Anda bisa mengkomitnya.

hpal
sumber
3

Inilah yang saya lakukan dan bekerja untuk saya.

Saya ingin membatalkan perubahan dalam banyak komit yang saya lakukan untuk waktu tertentu dan ingin pergi ke titik komit sebelumnya.

  1. Pergi ke Tim -> Tampilkan Sejarah.
  2. Klik kanan pada atau rentang revisi yang ingin Anda abaikan.
  3. Pilih opsi "Kembalikan perubahan".

Ini akan menjalankan penggabungan terbalik, membatalkan perubahan dalam copy pekerjaan Anda.

Cukup tinjau kode dan komit.

Ziya
sumber
2

Klik kanan pada hierarki tertinggi yang ingin Anda kembalikan >> RevertatauRevert to Revision

Yuval Adam
sumber
2

Sebagian besar jawaban sebelumnya telah menggunakan penggabungan terbalik, dan itu biasanya jawaban yang tepat. Namun, ada satu situasi (yang baru saja terjadi pada saya) di mana tidak.

Saya tidak sengaja mengubah file dengan ujung baris Unix ke ujung garis DOS ketika membuat perubahan kecil, dan melakukan itu. Ini mudah dibatalkan, baik dengan mengubah akhir baris dan melakukan lagi, atau dengan penggabungan terbalik, tetapi memiliki efek membuat svn blamedaftar edit saya sebagai sumber setiap baris file. (Menariknya, TortoiseSVN di Windows tidak terpengaruh oleh ini; hanya baris perintah svn blame.)

Jika Anda ingin mempertahankan riwayat seperti yang dilaporkan oleh svn blame, saya pikir Anda perlu melakukan hal berikut:

  • Hapus file dan komit.
  • Dalam repositori, salin salinan baik file sebelumnya ke kepala, dan komit.
  • Pulihkan suntingan yang ingin Anda pertahankan.

Penghapusannya sedikit menakutkan, tapi ingat Anda selalu menyimpan file di repositori, jadi memulihkannya bukan masalah besar. Berikut beberapa kode untuk menggambarkan langkah-langkahnya. Asumsikan itu xxxadalah nomor revisi dari salinan bagus terakhir.

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"

Perhatikan bahwa untuk salinan di repositori, tujuan harus berupa direktori, bukan nama file.

pengguna2554330
sumber
1

Klik kanan proyek> Ganti Dengan> Revisi atau URL> Pilih revisi spesifik yang ingin Anda kembalikan.

Sekarang komit versi kode pembaruan lokal ke repositori. Ini akan mengembalikan basis kode ke revisi tertentu.

KayV
sumber
1

Ada banyak jawaban berbahaya di halaman ini. Perhatikan bahwa sejak SVN versi 1.6, melakukan pembaruan -r dapat menyebabkan konflik pohon, yang dengan cepat meningkat menjadi data yang berpotensi kehilangan mimpi buruk kafkeresque di mana Anda mencari informasi tentang konflik pohon.

Cara yang benar untuk kembali ke versi adalah:

svn merge -r HEAD:12345 .

Di mana 12345 adalah nomor versi. Jangan lupa titiknya.

Burung hantu
sumber
0

Sinkronkan ke versi yang lebih lama dan komit. Ini harus melakukan trik.

Berikut juga penjelasan tentang membatalkan perubahan.

Mork0075
sumber
0

Singkatnya, jawaban Jon Skeet adalah solusi singkatnya, namun jika Anda seperti saya, Anda mungkin ingin penjelasan. Manual Subversion menyebut ini a

Cherry-Pick Gabung

Dari halaman manual.

  1. Bentuk ini disebut penggabungan 'cherry-pick': '-r N: M' mengacu pada perbedaan dalam sejarah cabang sumber antara revisi N dan M.

    'Rentang mundur' dapat digunakan untuk membatalkan perubahan. Misalnya, ketika sumber dan target merujuk ke cabang yang sama, revisi yang sebelumnya dilakukan dapat 'dibatalkan'. Dalam rentang terbalik , N lebih besar dari M di '-r N: M', atau opsi '-c' digunakan dengan angka negatif: '-c -M' setara dengan '-r M:'. Membatalkan perubahan seperti ini juga dikenal sebagai melakukan 'penggabungan terbalik'.


  • Jika sumbernya adalah file, maka perbedaan diterapkan ke file itu (berguna untuk menggabungkan perubahan sebelumnya). Jika tidak, jika sumbernya adalah direktori, maka targetnya adalah '.'

    Dalam penggunaan normal, copy pekerjaan harus terbaru, pada satu revisi, tanpa modifikasi lokal dan tidak ada sub-switched switch.

Contoh:

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

Ini akan menggantikan salinan lokal [2983] (yang, sesuai dengan kutipan di atas, harus disinkronkan dengan server - tanggung jawab Anda) dengan revisi 289 dari server. Perubahan terjadi secara lokal, yang berarti jika Anda memiliki checkout bersih, maka perubahan dapat diperiksa sebelum melakukan mereka.

Jonathan Komar
sumber
-1

Berikut ini berhasil bagi saya.

Saya punya banyak perubahan lokal dan harus membuang yang ada di salinan lokal dan checkout versi stabil terakhir di SVN.

  1. Periksa status semua file, termasuk file yang diabaikan.

  2. Grep semua baris untuk mendapatkan file yang baru ditambahkan dan diabaikan.

  3. Ganti yang dengan //.

  4. dan rm -rf semua baris.

    svn status --tidak-abaikan | grep '^ [? I]' | sed "s / ^ [? I] //" | xargs -I {} rm -rf "{}"

shah1988
sumber