วิธีที่ดีกว่าในการย้อนกลับไปใช้การแก้ไข SVN ก่อนหน้าของไฟล์หรือไม่


167

ฉันตั้งใจส่งไฟล์มากเกินไปไปยังที่เก็บ SVN และเปลี่ยนแปลงบางสิ่งที่ฉันไม่ได้ตั้งใจ (ถอนหายใจ) เพื่อที่จะเปลี่ยนพวกเขากลับสู่สภาวะก่อนหน้าพวกเขาสิ่งที่ดีที่สุดที่ฉันจะทำได้คือ

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

Jeez! ไม่มีทางไหนที่ดีกว่านี้เหรอ? ทำไมฉันไม่สามารถเขียนสิ่งนี้:

svn revert -r 854 l3toks.dtx

โอเคฉันใช้ v1.4.4 เท่านั้น แต่ฉันอ่านข้ามรายการการเปลี่ยนแปลงสำหรับสาขา 1.5 และฉันไม่เห็นสิ่งใดที่เกี่ยวข้องโดยตรงกับสิ่งนี้ ฉันคิดถึงอะไรเหรอ?


แก้ไข: ฉันเดาว่าฉันยังไม่ชัดเจนพอ ฉันไม่คิดว่าฉันต้องการที่จะกลับผสานแล้วเพราะฉันจะสูญเสียการเปลี่ยนแปลงที่ฉันไม่ต้องการที่จะทำให้! บอกได้เลยว่าfileAและfileBทั้งสองได้มีการปรับเปลี่ยน แต่ฉันต้องการเพียงที่จะกระทำfileA; พิมพ์โดยไม่ตั้งใจ

svn commit -m "small change"

fileBกระทำทั้งสองไฟล์และตอนนี้ฉันต้องการที่จะย้อนกลับ การผสานแบบย้อนกลับทำให้งานนี้ไม่ง่าย (เท่าที่ฉันสามารถบอกได้) กว่าขั้นตอนที่ฉันได้อธิบายไว้ข้างต้น


สำเนาที่เป็นไปได้ของฉันจะคืนค่า SVN ได้อย่างไร
Vadzim

คำตอบ:


243
svn merge -r 854:853 l3toks.dtx

หรือ

svn merge -c -854 l3toks.dtx

คำสั่งสองคำที่เทียบเท่ากัน


5
ขอบคุณสำหรับสิ่งนี้เพียงแค่ต้องการบอกบางสิ่ง - บอกว่าฉันแก้ไข 855 ฉันต้องการแปลงไฟล์กลับเป็น 854 ถ้าฉันทำsvn merge -c -854 my.fileแล้วทำsvn diffดูเหมือนว่าจะแสดงการแก้ไขหนึ่งครั้งก่อน 854 (นั่นคือ 853 ); เฉพาะเมื่อฉันทำsvm merge -c 854 myfile(ไม่มี-) ดูเหมือนว่าไฟล์ของฉันจะเปลี่ยนกลับเป็น rev 854 ขอบคุณอีกครั้งไชโย!
sdaau

11
มีเหตุผลใดที่ตัวเลือกแรกด้านบนทำงานได้อย่างมีเสน่ห์สำหรับฉันในขณะที่ตัวเลือกที่สองไม่ทำงานเลย?
skybondsor

7
อย่าลืมที่จะกระทำหลังจากการรวมกลับกัน ฉันมักจะลืม :)
Vineeth Pradhan

11
ควรลบ 1 นี่เพื่อไม่ให้ระบุความแตกต่างระหว่างสองคำสั่งนี้ คำตอบไม่ดี
Angry Dan

4
@sprog - หากมีความแตกต่างฉันขอขอบคุณที่รู้
orip

34

ตรวจสอบส่วน "การเลิกทำการเปลี่ยนแปลง " ของหนังสือ svn


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

32

ขอโทษที่ใช้พื้นที่ในการทำซ้ำคำตอบที่ได้รับก่อนหน้านี้ - แต่นี่คือสิ่งที่ฉันมักจะมีปัญหากับ

สมมติว่าฉันได้อัปเดตไฟล์ในตัวเครื่องเป็นรุ่นล่าสุดซึ่งก็คือ 854 จากนั้นฉันอยากได้รุ่นเก่ากว่า - รุ่นของไฟล์จากรุ่นก่อนหน้าไม่กี่รุ่นกล่าวว่ารุ่น 851

การคัดลอกจะใช้งานได้:

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

.. อย่างไรก็ตามฉันไม่สามารถถูก grepping สำหรับ repo URL :)

การอัปเดตที่ดูเหมือนจะใช้ได้:

svn up -r 851 ./l3toks.dtx

... อย่างไรก็ตามมันยังทำเครื่องหมายสำเนาในเครื่องว่า "เช็คเอาต์ใหม่" หรือ "เหมือนกับการแก้ไขออนไลน์" (เช่นใน Tortoise / RabbitVCS คุณจะได้รับเครื่องหมายถูกสีเขียว) - ซึ่งหมายความว่าคุณไม่สามารถทำได้svn ci -m "rolled back to r 851": เพียงเพราะท้องถิ่นsubversionปฏิบัติการจะไม่สังเกตเห็นการเปลี่ยนแปลงในเครื่องและจะไม่ต้องอัปโหลดข้อมูลใด ๆ ไปยังแหล่งเก็บข้อมูลออนไลน์

และตามที่ได้ตอบไปแล้วการรวมการย้อนกลับ - แต่ในกรณีนี้เราไม่ควรพึ่งพาไวยากรณ์ทางลัด แต่รัฐเฉพาะ:

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

ฉันต้องยอมรับ - ฉันจะไม่เข้าใจประโยค " ย้อนกลับการรวม r854 ถึง r852 เป็นไฟล์ " เพื่อหมายถึง " เพิ่งได้ r851 ของไฟล์ของคุณและเขียนทับสิ่งที่คุณเคยมีในท้องถิ่น - และมันถูกทำเครื่องหมายว่าแตกต่างจากการปรับปรุงออนไลน์ล่าสุดดังนั้น คุณสามารถตรวจสอบกลับมาออนไลน์ได้ในรูปแบบ 'การย้อนกลับ' ใหม่ "แต่ฉันเดา (และหวังว่า :)) นั่นคือสิ่งที่มันทำ :)

หลังจากนี้เราสามารถใช้svn diffเพื่อให้แน่ใจได้อย่างรวดเร็วหากเราได้รับการแก้ไขที่ถูกต้องในท้องถิ่น และไฟล์จะถูกทำเครื่องหมายด้วยเครื่องหมายอัศเจรีย์สีแดงใน Tortoise / RabbitVCS (นั่นคือแตกต่างจากเวอร์ชันล่าสุดที่มีข้อผูกมัด) และsvn ci -m "rolled back to r 851"สามารถเรียกใช้ในเวลานี้ได้

นอกจากนี้โปรดทราบว่าในที่สุดหากคุณเปลี่ยนใจหลังจากการรวมแบบย้อนกลับ ( เช่นคุณต้องการดำเนินการกับการแก้ไข HEAD ล่าสุดต่อไปที่นี่ 854 - หลังจากที่คุณย้อนกลับไปที่ 851 ในประเทศ แต่ยังไม่ได้ย้อนกลับ ) คุณไม่ควรใช้svn upเพราะจะบอกว่ามันเป็น " การแก้ไข 854 " อยู่แล้ว; ใช้แทนsvn revert --recursive .หรือคล้ายกัน ...

ไชโย!

Ref: วิธีย้อนกลับการเปลี่ยนแปลงโดยใช้การโค่นล้ม - Jacob Wright - Flex, AIR, PHP, ฯลฯ

แก้ไข: ... และเห็นได้ชัดว่าผลเช่นเดียวกับsvn merge -r HEAD:851 l3toks.dtxสามารถทำได้ด้วย:

svn export -r 851 l3toks.dtx
A    l3toks.dtx
Export complete.

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

1
ฉันมีปัญหากับการรวมกลับ แทนที่จะคิดว่าทำไมฉันลองส่งออกและมันก็ทำงานได้อย่างสมบูรณ์ ฉันอยากจะแนะนำเพียงแค่ใช้การส่งออก คุณสามารถใช้--forceเพื่อเขียนทับไดเรกทอรี เพียงจำไว้ว่ามันจะเขียนทับการเปลี่ยนแปลงใด ๆ
Nick

คำอธิบายที่ดีมากเกี่ยวกับสิ่งที่เกิดขึ้นจริง! ฉันใช้ AnkhSVN และ TortoiseSVN บ่อยครั้งและฉันไม่เห็นว่าจะใช้งานที่ไหนฉันจะทำsvn exportบางสิ่งหายไปหรือว่าใช้ไม่ได้กับ GUI เหล่านี้
Conrad

@Conrad คุณใช้โดยการคลิก "ส่งออก ... " ใน AnkhSVN และ "ส่งออก" ใน TortoiseSVN จากบริบทที่เก็บของคุณ (คลิกขวา) เมนู
nitinr708

10

เมื่อเร็ว ๆ นี้ฉันต้องกลับไปใช้การแก้ไขเฉพาะเพื่อแก้ไขข้อบกพร่องของสิ่งปลูกสร้างที่เก่ากว่าและสิ่งนี้ทำงานได้เหมือนเวทมนตร์:

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

ฉันต้องแก้ไขข้อขัดแย้งทั้งหมดโดยใช้ตัวเลือก "tc" เนื่องจากฉันไม่สนใจเกี่ยวกับการเปลี่ยนแปลงในท้องถิ่น (ตรวจสอบทุกสิ่งที่ฉันใส่ใจก่อนจะคืนค่า)

หากต้องการกลับไปแก้ไขส่วนหัวก็ง่ายเกินไป:

svn up

5

สิ่งที่คุณกำลังมองหาเรียกว่า "ย้อนกลับผสาน" คุณควรศึกษาเอกสารเกี่ยวกับฟังก์ชั่นการผสานในหนังสือ SVN (เช่น luapyad หรือผู้วิจารณ์คนแรกในโพสต์นั้นชี้ให้เห็นอย่างแม่นยำ) หากคุณใช้ Tortoise คุณสามารถเข้าไปที่มุมมองบันทึกและคลิกขวาแล้วเลือก "ย้อนกลับการเปลี่ยนแปลงจากการแก้ไขนี้" ที่คุณทำผิด


4

การรวมกลับเป็นสิ่งที่คุณต้องการ (ดูคำตอบของ luapyad) เพียงใช้การผสานกับไฟล์ที่ผิดพลาดแทนที่จะเป็นไดเรกทอรีทั้งหมด


4

หากคุณต้องการยกเลิกการเช็คอินล่าสุดเท่านั้นคุณสามารถใช้สิ่งต่อไปนี้

svn merge -r head:prev l3toks.dtx

ด้วยวิธีนี้คุณไม่จำเป็นต้องค้นหาหมายเลขรุ่นปัจจุบันและรุ่นก่อนหน้า


4

svn merge จะรวมการแก้ไขไม่ใช่การย้อนกลับ กล่าวคือหากคุณมีส่วนเพิ่มเติมในรุ่น HEAD ของคุณให้ผสานกับการแก้ไขครั้งก่อนแล้วการเปลี่ยนแปลงจะยังคงมีอยู่

ฉันใช้ svn cat จากนั้นเปลี่ยนเส้นทางไปยังไฟล์:

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

จากนั้นคุณมีเนื้อหา 851 ในไฟล์นั้นและสามารถตรวจสอบกลับมา


3

หากคุณใช้Eclipse IDEกับปลั๊กอิน SVNคุณสามารถทำได้ดังนี้:

  1. คลิกขวาที่ไฟล์ที่คุณต้องการเปลี่ยนกลับ (หรือโฟลเดอร์ที่มีอยู่หากคุณลบไฟล์โดยไม่ได้ตั้งใจและต้องการเพิ่มกลับ)
  2. เลือก " ทีม> สวิตช์ "
  3. เลือกปุ่ม radion "Revision" และป้อนหมายเลขการแก้ไขที่คุณต้องการเปลี่ยนกลับ คลิกตกลง
  4. ไปที่มุมมองซิงโครไนซ์
  5. เลือกไฟล์ทั้งหมดที่คุณต้องการเปลี่ยนกลับ
  6. คลิกขวาที่ส่วนที่เลือกแล้วทำ " Override and Commit ... "

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

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