Bagaimana cara mengembalikan komit SVN?

303

Saya telah menemukan berbagai contoh cara mengembalikan komit SVN

svn merge -r [current_version]:[previous_version] [repository_url]

atau

svn merge -c -[R] .

Tapi keduanya tidak bekerja. Saya mencoba perintah-perintah itu dan memeriksa file yang diubah dengan tangan.

Bagaimana cara mengembalikan komit dengan nomor revisi 1944? Bagaimana cara saya mengecek bahwa pengembalian telah dilakukan (tanpa melihat file sebenarnya dari perubahan yang telah dikembalikan)?

Alex
sumber
16
Apakah Anda tidak pernah menerima jawaban karena tidak ada yang berhasil?
2rs2ts
4
Jika Anda menginginkan jawaban literal, gunakan "svn merge -c -1944." Untuk memeriksa apakah itu berhasil: "svn diff"
John Sampson
Lihat juga Hapus semua jejak komit SVN .
Vadzim
Bagaimana jika kasusnya, saya memiliki 1943 (komitmen baik), kemudian 1944 (komitmen buruk), kemudian 1945 (komitmen baik), kemudian 1946 (komitmen baik). Sekarang saya ingin menghapus hanya 1944 (komit buruk) dan menyimpan semua revisi setelah 1944, berarti saya ingin hasil seperti 1943,1945,1946 (hapus hanya 1944) dari semua revisi ini, apa yang harus saya lakukan ??
Bhavin_m

Jawaban:

448

Kedua contoh harus bekerja, tetapi

svn merge -r UPREV:LOWREV . batalkan rentang

svn merge -c -REV . batalkan revisi tunggal

dalam sintaks ini - jika dir saat ini adalah WC dan (seperti yang harus dilakukan setelah setiap penggabungan) Anda akan memberikan hasil

Apakah Anda ingin melihat log?

Malas Badger
sumber
9
@dwjohnston - ya, penggabungan selalu dilakukan di WC dan itu bukan tugas sisi server
Lazy Badger
14
svn: Merge source required. Tidak ada dadu.
2rs2ts
27
@ 2rs2ts sepertinya Anda lupa tanda titik untuk menunjuk 'lakukan ini di direktori saat ini'.
Dalin
14
Anda juga dapat melakukan beberapa komitmen tunggal pada saat yang sama:svn merge -c -42587,-42589 .
mlathe
1
@ahnbizcad - revisi (tunggal), yang ingin Anda batalkan
Lazy Badger
130

Jika Anda menggunakan klien TortoiseSVN , itu mudah dilakukan melalui dialog Tampilkan Log .

dodgy_coder
sumber
5
Sejauh ini, ini adalah cara termudah untuk melakukannya
Markku K.
5
Ini sudah usang. Tidak ada lagi Menu Konteks yang tersedia untuk klien dalam versi saat ini.
user1789573
19
Apa? TortoiseSVN ADALAH menu konteks, ditambah dialog yang ditimbulkannya. Apa yang Anda maksud dengan "tidak ada lagi menu konteks"? Pasti ada!
Ben
@Ben, saya pikir user1789573 semakin tersandung atas penyebutan eksplisit "Menu Konteks" di tutorial yang terkait dengan jawaban.
Tom Catullo
2
Jika Anda melihat ini nanti, itu (masih) ada di sana. Di layar tampilkan log, klik kanan revisi dan ada opsi "Kembalikan ke Revisi Ini". Ini ada di TortoiseSVN 1.9.4 Build 27285. Saya baru saja menggunakannya dan dapat memberitahu Anda bahwa itu berfungsi dengan baik.
Bruce Van Horn
65

svn merge -r 1944:1943 .harus mengembalikan perubahan r1944 di copy pekerjaan Anda. Anda kemudian dapat meninjau perubahan dalam copy pekerjaan Anda (dengan diff), tetapi Anda harus berkomitmen untuk menerapkan pengembalian ke dalam repositori.

on15
sumber
4
Tidak berfungsi, membutuhkan sumber gabungan. svn merge -r 1944:1943 .Sudah mencoba , tetapi tidak ada yang berubah.
Alex
Sudahkah repositori naik sejak r1944? Jika demikian, apakah ada perubahan yang bertentangan pada baris yang sama dengan perubahan antara r1943 dan r1944?
1515
Saya pada revisi 1945 dan sepertinya tidak ada konflik. Tidak svn statusjuga svn diffmemberi apa pun.
Alex
7
Kesalahan:svn: Try 'svn help' for more info svn: Merge source required
Alex
5
Tapi svn merge -r 1945:1943 .sepertinya sudah berhasil. Saya rasa saya mengerti: Anda perlu menggabungkan versi dari 'sebelum' komitmen 'buruk' ke dalam repositori kerja Anda. Ini ok ketika Anda ingin melakukan 'revert' sederhana dari komit sebelumnya. Tetapi bagaimana jika Anda ingin mengembalikan perubahan yang dibuat dengan versi 1900?
Alex
45

Pertama, kembalikan copy pekerjaan ke 1943.

> svn merge -c -1943 .

Kedua, periksa apa yang akan dilakukan.

> svn status

Ketiga, komit versi 1945.

> svn commit -m "Fix bad commit."

Keempat, lihat log baru.

> svn log -l 4

------------------------------------------------------------------------
1945 | myname | 2015-04-20 19:20:51 -0700 (Mon, 20 Apr 2015) | 1 line

Fix bad commit.
------------------------------------------------------------------------
1944 | myname | 2015-04-20 19:09:58 -0700 (Mon, 20 Apr 2015) | 1 line

This is the bad commit that I made.
------------------------------------------------------------------------
1943 | myname | 2015-04-20 18:36:45 -0700 (Mon, 20 Apr 2015) | 1 line

This was a good commit.
------------------------------------------------------------------------
Shaun Luttin
sumber
1
Bagaimana jika kasusnya, saya memiliki 1943 (komitmen baik), kemudian 1944 (komitmen buruk), kemudian 1945 (komitmen baik), kemudian 1946 (komitmen baik). Sekarang saya ingin menghapus hanya 1944 (komit buruk) dan menyimpan semua revisi setelah 1944, berarti saya ingin hasil seperti 1943,1945,1946 (hapus hanya 1944) dari semua revisi ini, apa yang harus saya lakukan ??
Bhavin_m
26

Tidak mungkin untuk "tidak berkomitmen" revisi, tetapi Anda dapat mengembalikan copy pekerjaan Anda ke versi 1943 dan melakukan itu sebagai versi 1945. Versi 1943 dan 1945 akan identik, secara efektif mengembalikan perubahan.

Jakub Zaverka
sumber
18
Agar akurat, saya berkomentar bahwa jika Anda memiliki akses admin ke repositori, Anda dapat "tidak berkomitmen". Ini dengan membuat repositori klon hingga revisi yang diberikan menggunakan svn dumpdan kemudian svn load. Tapi, tentu saja, ini tidak boleh digunakan dalam keadaan normal.
tanggal
4
Saya tidak ingin berhenti berkomitmen, saya ingin membuat nomor komit baru dengan komit tertentu terbalik. Set mengatakan saya telah memeriksa versi 1944, membuat komit pada tahun 1945, yang ingin saya 'kembalikan'. Kemudian saya ingin memiliki versi 1946, yang file-nya identik dengan yang ada di versi 1944. (Kecuali sejarah tentu saja.) Tetapi pertanyaannya tetap: Bagaimana cara melakukannya? Apa saja perintahnya?
Alex
//, @Alex, aku juga tertarik dengan ini, terutama pada sesuatu yang analog $ git revert. Saya merasa agak sulit untuk belajar SVN setelah menggunakan Git begitu lama.
Nathan Basanese
10

Berikut ini akan melakukan lari kering, seperti yang tertulis. HEAD menjadi versi saat ini, PREV sebelumnya, lalu jalur ke file Anda, atau item yang dikomit:

svn merge --dry-run -rHEAD:PREV https://example.com/svn/myproject/trunk

Jika proses kering terlihat bagus, jalankan perintah tanpa --dry-run

Verifikasi perubahan revisi dan komit kembali. Untuk menelusuri nomor versi, coba:

svn log
BentheFolker
sumber
4
F=code.c
REV=123
svn diff -c $REV $F | patch -R -p0 \
    && svn commit -m "undid rev $REV" $F
selamat tinggal
sumber
Apakah ini memerlukan salinan lokal berbeda dari revisi yang buruk?
Eliezer Miron
2

Alex, coba ini: svn menggabungkan [WorkingFolderPath] -r 1944: 1943

Nikita
sumber
2

Meskipun saran yang diberikan mungkin berhasil untuk sebagian orang, itu tidak berfungsi untuk kasus saya. Saat melakukan penggabungan, pengguna rev 1443yang melakukan pembaruan rev 1445, masih menyinkronkan semua file yang diubah 1444meskipun sama1443 dari gabungan. Saya membutuhkan pengguna akhir untuk tidak melihat pembaruan sama sekali.

Jika Anda ingin menyembunyikan komit sepenuhnya, dimungkinkan dengan membuat cabang baru di revisi yang benar dan kemudian menukar cabang. Satu-satunya hal yang perlu Anda hapus dan tambahkan kembali semua kunci.

copy -r 1443 file:///<your_branch> file:///<your_branch_at_correct_rev>
svn move file:///<your_branch> file:///<backup_branch>
svn move file:///<your_branch_at_correct_rev> file:///<your_branch>

Ini bekerja untuk saya, mungkin akan sangat membantu untuk orang lain di luar sana =)

droxxodia
sumber
2
svn merge -c -M PATH

Ini menyelamatkan hidupku.

Saya mengalami masalah yang sama, setelah kembali juga saya tidak melihat kode lama. Setelah menjalankan perintah di atas saya mendapat kode versi lama yang bersih.

amit ghosh
sumber
1

Saya mencoba di atas, ( svn merge) dan Anda benar, itu tidak jack. Namun

svn update -r <revision> <target> [-R]

tampaknya berfungsi, tetapi tidak permanen (svn saya hanya menunjukkan revisi lama). Jadi saya harus melakukannya

mv <target> <target backup>
svn update <target>
mv <target backup> <target>
svn commit -m "Reverted commit on <target>" <target>

Dalam kasus khusus saya, target saya adalah interfaces/AngelInterface.php. Saya membuat perubahan pada file, melakukan itu, memperbarui komputer build menjalankan kompiler phpdoc dan menemukan perubahan saya adalah buang-buang waktu. svn log interfaces/AngelInterface.phpmemperlihatkan perubahan saya sebagai r22060 dan komit sebelumnya pada file itu adalah r22059. Jadi saya bisa svn update -r 22059 interfaces/AngelInterface.phpdan saya berakhir dengan kode seperti di -r22059 lagi. Kemudian :-

mv interfaces/AngelInterface.php interfaces/AngelInterface.php~
svn update interfaces/AngelInterface.php
mv interfaces/AngelInterface.php~ interfaces/AngelInterface.php
svn commit -m "reverted -r22060" interfaces/AngelInterface.php

Atau saya bisa melakukan hal yang sama pada direktori, dengan menentukan . -Rdi tempat interfaces/AngelInterface.phpdi semua di atas.

sibaz
sumber
1
Satu hal lagi, seperti yang sudah dikatakan, yang tidak bisa Anda lakukan adalah menghapus komit dari sejarah, seperti yang dapat Anda lakukan di git dengan meretas referensi secara langsung. Yang dapat Anda lakukan, adalah menggunakan repositori untuk mengubah sumber Anda sesuai keinginan Anda, dan komit sebagai perubahan.
sibaz
Setelah menyelidiki lebih lanjut saya dapat melihat bahwa adalah mungkin untuk menghapus komit dari sejarah menggunakan svnadmin tetapi Anda sangat disarankan untuk tidak melakukannya. Lihat stackoverflow.com/questions/5566327/…
sibaz
0

Jika Anda ingin menghapus komit sepenuhnya dari riwayat, Anda juga dapat melakukan dump dari repo di revisi tertentu, lalu mengimpor dump itu. Secara khusus:

svnrdump dump -r 1:<rev> <url> > filename.dump

Perintah svnrdump melakukan fungsi yang sama dengan svnadmin dump tetapi bekerja pada repo jarak jauh.

Selanjutnya hanya mengimpor file dump ke repo pilihan Anda. Ini diuji untuk bekerja dengan baik di Beanstalk.

redcalfee
sumber