ฉันจะคืนค่า SVN ที่ส่งคืนได้อย่างไร


303

ฉันได้พบตัวอย่างมากมายของวิธีการคืนค่า SVN ที่กระทำเช่นนั้น

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

หรือ

svn merge -c -[R] .

แต่ดูเหมือนว่าพวกเขาทั้งสองจะไม่ทำงาน ฉันลองคำสั่งเหล่านั้นและตรวจสอบไฟล์ที่เปลี่ยนแปลงด้วยมือ

ฉันจะเปลี่ยนการยืนยันด้วยหมายเลขการแก้ไข 1944 ได้อย่างไร ฉันจะตรวจสอบได้อย่างไรว่าการแปลงกลับได้ดำเนินการแล้ว (โดยไม่ได้ดูไฟล์จริงของการเปลี่ยนแปลงที่ถูกเปลี่ยนกลับ)


16
คุณไม่เคยยอมรับคำตอบเพราะไม่มีใครทำงาน?
— 2rs2ts

4
หากคุณต้องการคำตอบที่แท้จริงให้ใช้ "svn merge -c -1944" วิธีตรวจสอบว่าใช้งานได้หรือไม่: "svn diff"
— John Sampson

ดูเพิ่มเติมลบร่องรอยทั้งหมดของ SVN กระทำ
— Vadzim


ถ้าเป็นเช่นนั้นฉันมี 1943 (การกระทำดี) จากนั้น 1944 (การกระทำไม่ดี) จากนั้น 1945 (การกระทำดี) จากนั้นปี 1946 (การกระทำดี) ตอนนี้ฉันต้องการลบเพียง 1,944 (กระทำไม่ดี) และให้การแก้ไขทั้งหมดหลังจาก 1944 หมายความว่าฉันต้องการผลลัพธ์เช่น 1943,1945,1946 (ลบเฉพาะ 1944) จากการแก้ไขเหล่านี้ทั้งหมดฉันควรทำอย่างไร ??
— Bhavin_m

คำตอบ:


448

ทั้งสองตัวอย่างต้องใช้งานได้ แต่

svn merge -r UPREV:LOWREV . ยกเลิกช่วง

svn merge -c -REV . ยกเลิกการแก้ไขครั้งเดียว

ในรูปแบบนี้ - ถ้า dir ปัจจุบันคือ WC และ (ตามที่ต้องทำหลังจากการรวมทุกครั้ง) คุณจะยอมรับผลลัพธ์

คุณต้องการที่จะเห็นบันทึก?


9
@dwjohnston - ใช่การผสานจะดำเนินการใน WC เสมอและไม่ใช่งานฝั่งเซิร์ฟเวอร์
— Lazy Badger

14
svn: Merge source required. ไม่มีลูกเต๋า
— 2rs2ts

27
@ 2rs2ts ดูเหมือนว่าคุณลืมจุดต่อท้ายเพื่อกำหนด 'ทำสิ่งนี้ในไดเรกทอรีปัจจุบัน'
— Dalin

14
นอกจากนี้คุณยังสามารถทำคอมมิทหลายรายการพร้อมกันได้:svn merge -c -42587,-42589 .
— ธ

1
@ahnbizcad - การแก้ไข (เดี่ยว) ซึ่งคุณต้องการยกเลิก
— Lazy Badger

130

หากคุณกำลังใช้TortoiseSVNลูกค้าก็ทำได้อย่างง่ายดายผ่านทางโต้ตอบแสดงเข้าสู่ระบบ


5
นี่เป็นวิธีที่ง่ายที่สุดที่จะทำ
— Markku K.

5
สิ่งนี้ล้าสมัยแล้ว ไม่มี Context-Menu สำหรับไคลเอ็นต์ในเวอร์ชันปัจจุบันอีกต่อไป
— user1789573

19
อะไร? TortoiseSVN เป็นเมนูบริบทรวมถึงกล่องโต้ตอบที่วางไข่ คุณหมายถึงอะไรโดย "ไม่มีเมนูบริบท" อีกต่อไป? แน่นอนที่สุดคือ!
— Ben

@Ben ฉันคิดว่า user8,89573 ได้รับการเพิ่มขึ้นเล็กน้อยในการกล่าวถึงอย่างชัดเจนของ "เมนูบริบท" ในการกวดวิชาที่เชื่อมโยงกับคำตอบ
— Tom Catullo

2
ในกรณีที่คุณเห็นสิ่งนี้ในภายหลังมัน (ยัง) อยู่ที่นั่น ในหน้าจอล็อกการแสดงให้คลิกขวาที่การแก้ไขและมีตัวเลือก "เปลี่ยนกลับเป็นการแก้ไขนี้" นี่คือ TortoiseSVN 1.9.4 Build 27285 ฉันเพิ่งใช้ไปและสามารถบอกคุณได้ว่าใช้งานได้ดี
— Bruce Van Horn

65

svn merge -r 1944:1943 .ควรย้อนกลับการเปลี่ยนแปลงของ r1944 ในสำเนาการทำงานของคุณ จากนั้นคุณสามารถตรวจสอบการเปลี่ยนแปลงในสำเนาการทำงานของคุณ (ที่มี diff) แต่คุณต้องยอมรับเพื่อที่จะนำการเปลี่ยนกลับมาใช้ในพื้นที่เก็บข้อมูล


4
ไม่ทำงานต้องการแหล่งที่มาผสาน พยายามsvn merge -r 1944:1943 .แทน แต่ไม่มีอะไรเปลี่ยนแปลง
— อเล็กซ์

ที่เก็บมีความก้าวหน้าตั้งแต่ r1944 หรือไม่? ถ้าเป็นเช่นนั้นมีการเปลี่ยนแปลงที่ขัดแย้งกันในบรรทัดเดียวกันกับการเปลี่ยนแปลงระหว่าง r1943 และ r1944 หรือไม่?
— onon15

ฉันอยู่ที่การแก้ไขในปี 1945 และดูเหมือนจะไม่มีความขัดแย้ง ทั้งsvn statusมิได้svn diffให้อะไร
— อเล็กซ์

7
ข้อผิดพลาด:svn: Try 'svn help' for more info svn: Merge source required
— Alex

5
แต่svn merge -r 1945:1943 .ดูเหมือนว่าจะได้ผล ฉันคิดว่าฉันเข้าใจ: คุณต้องรวมเวอร์ชันจาก 'ก่อน' คำว่า 'ไม่ดี' ลงในที่เก็บข้อมูลที่ใช้งานได้ของคุณ ไม่เป็นไรเมื่อคุณต้องการ 'ย้อนกลับ' การกระทำก่อนหน้านี้อย่างง่าย แต่ถ้าคุณต้องการยกเลิกการเปลี่ยนแปลงที่ทำกับรุ่น 1900
— อเล็กซ์

45

ก่อนอื่นให้ย้อนกลับสำเนาการทำงานเป็น 1943

> svn merge -c -1943 .

ประการที่สองตรวจสอบสิ่งที่จะเกิดขึ้น

> svn status

ประการที่สามกระทำเวอร์ชัน 1945

> svn commit -m "Fix bad commit."

ประการที่สี่ดูบันทึกใหม่

> 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.
------------------------------------------------------------------------

1
ถ้าเป็นเช่นนั้นฉันมี 1943 (การกระทำดี) จากนั้น 1944 (การกระทำไม่ดี) จากนั้น 1945 (การกระทำดี) จากนั้นปี 1946 (การกระทำดี) ตอนนี้ฉันต้องการลบเพียง 1,944 (กระทำไม่ดี) และให้การแก้ไขทั้งหมดหลังจาก 1944 หมายความว่าฉันต้องการผลลัพธ์เช่น 1943,1945,1946 (ลบเฉพาะ 1944) จากการแก้ไขเหล่านี้ทั้งหมดฉันควรทำอย่างไร ??
— Bhavin_m

26

เป็นไปไม่ได้ที่จะ "ยกเลิกการแก้ไข" แต่คุณสามารถเปลี่ยนสำเนาการทำงานของคุณเป็นเวอร์ชัน 1943 และยอมรับว่าเป็นเวอร์ชัน 1945 เวอร์ชัน 1943 และ 1945 จะเหมือนกันโดยการคืนค่าการเปลี่ยนแปลงได้อย่างมีประสิทธิภาพ


18
เพียงเพื่อให้ถูกต้องน่ารำคาญฉันจะแสดงความคิดเห็นว่าถ้าคุณมีผู้ดูแลระบบสามารถเข้าถึงที่เก็บคุณสามารถ "uncommit" โดยการสร้างที่เก็บโคลนถึงการแก้ไขให้ใช้แล้วsvn dump svn loadแต่แน่นอนว่าสิ่งนี้ไม่ควรใช้ในสถานการณ์ปกติ
— onon15

4
ฉันไม่ต้องการเลิกผูกมัดฉันต้องการสร้างหมายเลขการส่งมอบใหม่ด้วยการส่งข้อมูลบางรายการ ชุดบอกว่าฉันได้ตรวจสอบรุ่น 1944 ทำกระทำในปี 1945 ซึ่งฉันต้องการที่จะ 'เปลี่ยนกลับ' ถ้าอย่างนั้นฉันอยากได้รุ่น 1946 ซึ่งมีไฟล์เหมือนกันในรุ่น 1944 (ยกเว้นประวัติแน่นอน) แต่คำถามก็ยังคงอยู่: ทำอย่างไร? คำสั่งคืออะไร?
— อเล็กซ์

// @ Alex $ git revertผมสนใจในเรื่องนี้มากเกินไปโดยเฉพาะอย่างยิ่งในบางสิ่งบางอย่างที่คล้ายคลึงกับ ฉันพบว่ามันยากที่จะเรียนรู้ SVN หลังจากใช้ Git มานาน
— Nathan Basanese

10

ต่อไปนี้จะทำงานในลักษณะแห้ง HEAD เป็นเวอร์ชันปัจจุบัน PREV เป็นรุ่นก่อนหน้าจากนั้นพา ธ ไปยังไฟล์ของคุณหรือรายการที่กำหนด:

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

หากการรันแบบแห้งดูดีให้รันคำสั่งโดยไม่ใช้ --dry-run

ตรวจสอบการเปลี่ยนแปลงในการแก้ไขและกระทำอีกครั้ง ในการเรียกดูหมายเลขรุ่นลอง:

svn log

4
F=code.c
REV=123
svn diff -c $REV $F | patch -R -p0 \
    && svn commit -m "undid rev $REV" $F

สิ่งนี้ต้องใช้สำเนาภายในเครื่องหรือไม่เพื่อให้แตกต่างจากการแก้ไขที่ผิด
— Eliezer Miron


2

แม้ว่าคำแนะนำที่ให้ไว้อาจใช้ได้กับบางคน แต่ก็ไม่ได้ผลสำหรับกรณีของฉัน เมื่อดำเนินการผสานผู้ใช้rev 1443ที่อัปเดตrev 1445ยังคงซิงค์ไฟล์ทั้งหมดที่เปลี่ยนแปลงใน1444แม้ว่าจะเท่ากับ1443จากการผสาน ฉันต้องการให้ผู้ใช้ปลายทางไม่เห็นการอัพเดทเลย

หากคุณต้องการซ่อนการกระทำอย่างสมบูรณ์เป็นไปได้โดยการสร้างสาขาใหม่ในการแก้ไขที่ถูกต้องแล้วเปลี่ยนสาขา สิ่งเดียวคือคุณต้องลบและเพิ่มล็อคทั้งหมด

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>

สิ่งนี้ใช้ได้กับฉันบางทีมันอาจจะเป็นประโยชน์กับคนอื่นที่นั่น =)


2
svn merge -c -M PATH

สิ่งนี้ช่วยชีวิตฉันได้

ฉันมีปัญหาเดียวกันหลังจากย้อนกลับและฉันไม่เห็นรหัสเก่า หลังจากใช้คำสั่งข้างต้นฉันได้รับรหัสเวอร์ชั่นเก่าที่สะอาด


1

ฉันลองด้านบน ( svn merge) และคุณพูดถูกแจ็ค อย่างไรก็ตาม

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

ดูเหมือนว่าจะทำงาน แต่ไม่ถาวร (svn ของฉันเป็นเพียงการแสดงการแก้ไขเก่า) ดังนั้นฉันต้อง

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

interfaces/AngelInterface.phpโดยเฉพาะในกรณีของฉันเป้าหมายของฉันคือ ฉันทำการเปลี่ยนแปลงไฟล์ส่งคอมมิชชันอัพเดตคอมพิวเตอร์การสร้างรันคอมไพเลอร์ phpdoc และพบว่าการเปลี่ยนแปลงของฉันเสียเวลา svn log interfaces/AngelInterface.phpแสดงการเปลี่ยนแปลงของฉันในฐานะ r22060 และการคอมมิชชันก่อนหน้านี้ในไฟล์นั้นคือ r22059 ดังนั้นฉันจึงสามารถsvn update -r 22059 interfaces/AngelInterface.phpลงเอยด้วยรหัสได้เหมือนเดิมใน -r22059 อีกครั้ง จากนั้น: -

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

อีกทางเลือกหนึ่งที่ฉันจะทำในสิ่งเดียวกันในไดเรกทอรีโดยระบุ. -Rในสถานที่ของinterfaces/AngelInterface.phpในทั้งหมดข้างต้น


1
อีกอย่างหนึ่งที่ได้กล่าวไปแล้วสิ่งที่คุณไม่สามารถทำได้คือลบการกระทำจากประวัติศาสตร์เช่นคุณสามารถทำได้โดยการแฮ็คผู้อ้างอิงโดยตรง สิ่งที่คุณทำได้คือใช้พื้นที่เก็บข้อมูลเพื่อเปลี่ยนแหล่งที่มาของคุณเป็นวิธีที่คุณตั้งใจและยอมรับว่าเป็นการเปลี่ยนแปลง
— sibaz

หลังจากตรวจสอบเพิ่มเติมฉันจะเห็นว่าเป็นไปได้ที่จะลบการกระทำออกจากประวัติศาสตร์โดยใช้ svnadmin แต่คุณได้รับคำแนะนำอย่างมาก ดูstackoverflow.com/questions/5566327/…
— sibaz

0

หากคุณต้องการลบการคอมมิทออกจากประวัติคุณสามารถทำการดัมพ์ของ repo ที่การแก้ไขเฉพาะจากนั้นนำเข้าการถ่ายโอนข้อมูลนั้น โดยเฉพาะ:

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

คำสั่ง svnrdump ดำเนินการฟังก์ชันเดียวกันกับการถ่ายโอนข้อมูล svnadmin แต่ทำงานบน repo ระยะไกล

ถัดไปเพียงนำเข้าไฟล์ดัมพ์ไปยัง repo ที่คุณต้องการ สิ่งนี้ได้รับการทดสอบว่าทำงานได้ดีบน Beanstalk

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.