ฉันจะกลับไปใช้โค้ดรุ่นเก่าในการโค่นล้มได้อย่างไร


486

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

ฉันใช้ "anksvn" กับ vs08

ฉันมีเวอร์ชันที่ฉันต้องการบนพีซีของฉัน แต่การส่งผิดพลาด; ข้อความที่ฉันได้รับคือ "การส่งข้อมูลล้มเหลวไฟล์หรือไดเรกทอรีล้าสมัย"

ฉันยังมีไคลเอ็นต์การโค่นล้มบนพีซีของฉัน

คำตอบ:


783

โดยทั่วไปคุณต้อง "รวมย้อนหลัง" - ใช้ความแตกต่างระหว่างรุ่นปัจจุบันและรุ่นก่อนหน้ากับรุ่นปัจจุบัน (ดังนั้นคุณจะได้สำเนาที่ใช้งานได้ดูเหมือนเวอร์ชั่นเก่า) จากนั้นจึงส่งอีกครั้ง ตัวอย่างเช่นจากการแก้ไข 150 (ปัจจุบัน) กลับไปสู่การแก้ไข 140:

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

โค่นล้มหนังสือปกแดงมีส่วนที่ดีเกี่ยวกับเรื่องนี้


3
แต่การผสานไม่ได้แทนที่การเปลี่ยนแปลงของฉันและการแก้ไขใหม่
เฉิน Kinnrot

76
หากคุณใช้ TortoiseSVN ให้คลิกขวาที่ไฟล์เลือกผสานแล้วผสานช่วงของการแก้ไข ในประเภทบันทึกกล่องใน 140-150 และคลิกช่องทำเครื่องหมายย้อนกลับ หลังจากนั้นกระทำตามปกติ สิ่งนี้จะดำเนินการเช่นเดียวกับตัวอย่างของจอน
DavGarcia

8
ด้วย eclipse และ subclipse คุณสามารถคลิกขวาที่โครงการของคุณ Team / Show History จากนั้นเลือกการแก้ไขที่คุณต้องการ "เลิกทำ" และด้วยการคลิกขวาอีกครั้งเลือก "ยกเลิกการเปลี่ยนแปลงจากการแก้ไขที่เลือก"
fego

36
หากต้องการย้อนกลับจากการแก้ไขหัวคุณสามารถเขียนsvn merge -r HEAD:140ได้
sschmeck

3
คำสั่ง TortoiseSVN ของ @DavGarcia ไม่เหมาะสำหรับฉันอย่างน้อยที่สุดก็ไม่ต้องแปลงไฟล์ทั้งหมดในการแก้ไขใหม่ (โดยใช้ TortoiseSVN 1.8.8) คลิกขวาที่โฟลเดอร์เลือก TortoisSVN-> Show log เลือกการแก้ไขที่คุณต้องการเปลี่ยนกลับคลิกขวาเหมือนพูดว่า "ยกเลิกการเปลี่ยนแปลงจากการแก้ไขนี้" ยอมรับการเปลี่ยนแปลง
mhenry1384

177

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

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

ค้นหาหมายเลขการแก้ไขที่ดีและย้อนกลับ

  1. ค้นหาหมายเลขการแก้ไขของสำเนาเก่าที่คุณต้องการ

    รับการแก้ไขปัจจุบันของคุณด้วย:

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

    หรือเพื่อตรวจสอบโปรเจ็กต์ที่เก่ากว่าของคุณให้ใช้:

    svn update -r <earlier_revision_number>

    จนกว่าคุณจะพบหมายเลขการแก้ไขที่ถูกต้อง

  2. จดบันทึกหมายเลขการแก้ไขที่ดี (โดยถือว่า123เป็นตัวอย่างด้านล่าง)

  3. อัปเดตเป็นรุ่นล่าสุด:

    svn update
  4. เลิกทำการเปลี่ยนแปลงทั้งหมดระหว่างการแก้ไขที่คุณต้องการและเวอร์ชั่นล่าสุด:

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

    (เช่นเดียวกับคำตอบของ Jon Skeet ด้านบน)

หากคุณไม่พบหมายเลขการแก้ไข

หากคุณไม่พบสำเนาเก่าและคุณเพียงต้องการส่งไฟล์ในคอมพิวเตอร์ของคุณ:

  1. ทำสำเนารุ่นที่ดีของคุณ (แต่ไม่มี.svnโฟลเดอร์ใด ๆ):

    cd ..
    rsync -ai --exclude=.svn  project/  project-good/
  2. ตอนนี้ให้แน่ใจว่าคุณมีเวอร์ชันล่าสุด:

    cd project
    svn update
    # or make a fresh checkout
    svn checkout <url>
  3. คัดลอกเวอร์ชั่นที่ดีของคุณไว้ด้านบนของสำเนาการทำงาน

    คำสั่งนี้จะคัดลอกและลบไฟล์ใด ๆ จากแผนผังการทำงานที่ไม่ได้อยู่ในสำเนาที่ดีของคุณ แต่จะไม่มีผลกับ.svnโฟลเดอร์ที่มีอยู่

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

    หากคุณไม่มี rsync คุณสามารถใช้cp -aแต่คุณจะต้องลบไฟล์ที่ไม่ต้องการด้วยตนเอง

  4. คุณควรจะสามารถยอมรับสิ่งที่คุณมีตอนนี้

    cd project
    svn commit "Reverted to good copy"

2
svn ไม่ตีความว่าเป็นการดัดแปลงฉันไม่สามารถยอมรับได้
Sandburg

svn ผสาน -r HEAD: 12345 เป็นคำสั่งที่ถูกต้องในการเปลี่ยนกลับอย่าทำการ update -r คุณเป็นคนบ้า
Owl

ฉันเดาว่าคำตอบนี้ได้รับการสนับสนุนจากผู้ที่ไม่สามารถหาหมายเลขการแก้ไขหรือผู้ที่ชื่นชมคำอธิบายนำ ฉันได้อัปเดตคำตอบทันทีเพื่อรวมทั้งสองวิธี
joeytwiddle

36

เพียงใช้บรรทัดนี้

svn update -r yourOldRevesion

คุณสามารถทราบการแก้ไขปัจจุบันของคุณโดยใช้:

ข้อมูล svn


15
นี่ไม่ได้แก้ปัญหา สิ่งนี้จะสร้างสภาพที่ผู้ถามอยู่ในเวลาที่ถามคำถามของพวกเขา
Ingo Schalk-Schupp

1
หากคุณโชคร้ายพอที่จะทำตามคำแนะนำนี้ให้เรียกใช้: "svn แก้ไข - ยอมรับการทำงาน -R"
Owl

27

วิธีการมาตรฐานในการใช้ผสานเพื่อยกเลิกการเช็คอินทั้งหมดทำได้ดีถ้าเป็นสิ่งที่คุณต้องการ อย่างไรก็ตามบางครั้งสิ่งที่คุณต้องการทำคือย้อนไฟล์เดียว ไม่มีวิธีที่ถูกต้องในการทำเช่นนั้น แต่มีแฮ็ค:

  1. ค้นหาเวอร์ชันที่คุณต้องการโดยใช้บันทึก svn
  2. ใช้คำสั่งย่อยการส่งออกของ svn:

    svn ส่งออกhttp: // url-to-your-file @ 123 / tmp / filename

(โดยที่ 123 คือหมายเลขการแก้ไขสำหรับไฟล์เวอร์ชันที่ดี) จากนั้นย้ายหรือคัดลอกไฟล์เดี่ยวนั้นเพื่อเขียนทับไฟล์เก่า เช็กอินไฟล์ที่ถูกแก้ไขและทำเสร็จแล้ว


ใช้ Tortoise-svn ฉันสามารถคลิกขวาที่ไฟล์เดียวและรวมมัน ควรมีวิธีการทำเช่นนี้โดยใช้svnเช่นกัน?
lc

10
svn cat -r 123 path-in-your-working-copy > path-in-your-working-copy
dash17291


5

ฉันคิดว่านี่เหมาะสมที่สุด:

ทำการผสานการย้อนกลับถ้ารหัสที่กำหนดมีการแก้ไขจาก rev 5612 ถึง 5616 เพียงรวมมันย้อนหลัง มันทำงานได้ในตอนท้ายของฉัน

ตัวอย่างเช่น

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

มันจะมีรหัสที่ผสานกลับไปเป็นรุ่นก่อนหน้าจากนั้นคุณสามารถส่งรหัสได้


3

นี่คือสิ่งที่ฉันทำและทำงานให้ฉัน

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

  1. ไปที่ทีม -> แสดงประวัติ
  2. คลิกขวาที่หรือช่วงการแก้ไขที่คุณต้องการเพิกเฉย
  3. เลือกตัวเลือก "เปลี่ยนกลับ"

สิ่งนี้จะเรียกใช้การผสานย้อนกลับเลิกทำการเปลี่ยนแปลงในสำเนาการทำงานของคุณ

เพียงตรวจสอบรหัสและส่งมอบ



2

คำตอบก่อนหน้านี้ส่วนใหญ่ใช้การรวมย้อนกลับและนั่นคือคำตอบที่ถูกต้อง อย่างไรก็ตามมีสถานการณ์หนึ่ง (ที่เพิ่งเกิดขึ้นกับฉัน) ที่มันไม่ใช่

ฉันเปลี่ยนไฟล์โดยใช้ Unix line endings เป็น DOS endings เมื่อทำการเปลี่ยนแปลงเล็กน้อยและยืนยัน สิ่งนี้สามารถยกเลิกได้อย่างง่ายดายไม่ว่าจะโดยการเปลี่ยนการสิ้นสุดบรรทัดและการคอมมิชชันอีกครั้งหรือโดยการรวมกลับ แต่มันมีผลทำให้การsvn blameแก้ไขรายการของฉันเป็นแหล่งที่มาของทุกบรรทัดของไฟล์ (น่าสนใจ TortoiseSVN บน Windows ไม่ได้รับผลกระทบจากสิ่งนี้เพียงแค่บรรทัดคำสั่งsvn blame)

หากคุณต้องการรักษาประวัติตามที่รายงานไว้โดยsvn blameฉันคิดว่าคุณต้องทำสิ่งต่อไปนี้:

  • ลบไฟล์และคอมมิชชัน
  • ในที่เก็บให้คัดลอกสำเนาที่ดีก่อนหน้าของไฟล์ลงในส่วนหัวแล้วคอมมิต
  • กู้คืนการแก้ไขใด ๆ ที่คุณต้องการเก็บไว้

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

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"

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


1

คลิกขวาที่โครงการ> แทนที่ด้วย> การแก้ไขหรือ URL> เลือกการแก้ไขเฉพาะที่คุณต้องการเปลี่ยนกลับ

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


1

มีคำตอบที่เป็นอันตรายมากมายในหน้านี้ โปรดทราบว่าตั้งแต่ SVN เวอร์ชัน 1.6 การทำการอัพเดต -r อาจทำให้เกิดข้อขัดแย้งของต้นไม้ซึ่งจะส่งผลต่อข้อมูลที่อาจสูญเสียฝันร้าย kafkeresque อย่างรวดเร็วซึ่งคุณกำลังค้นหาข้อมูลเกี่ยวกับความขัดแย้งของต้นไม้

วิธีที่ถูกต้องในการเปลี่ยนกลับเป็นเวอร์ชันคือ:

svn merge -r HEAD:12345 .

โดยที่ 12345 คือหมายเลขเวอร์ชัน อย่าลืมจุด


0

ซิงค์กับเวอร์ชันที่เก่ากว่าและส่ง สิ่งนี้ควรทำเคล็ดลับ

นี่คือคำอธิบายของการเลิกทำการเปลี่ยนแปลง


0

คำตอบของ Jon Skeet นั้นเป็นคำตอบที่ค่อนข้างสั้นอย่างไรก็ตามถ้าคุณชอบฉันคุณอาจต้องการคำอธิบาย คู่มือการโค่นล้มเรียกสิ่งนี้ว่า

ผสาน Cherry-Pick

จากหน้าคน

  1. แบบฟอร์มนี้เรียกว่าการรวม 'cherry-pick': '-r N: M' หมายถึงความแตกต่างในประวัติศาสตร์ของสาขาต้นกำเนิดระหว่างการแก้ไข N และ M

    สามารถใช้ 'ช่วงย้อนกลับ' เพื่อยกเลิกการเปลี่ยนแปลง ตัวอย่างเช่นเมื่อแหล่งที่มาและเป้าหมายอ้างถึงสาขาเดียวกันการแก้ไขที่กำหนดไว้ก่อนหน้านี้อาจเป็น 'เลิกทำ' ในช่วงย้อนกลับ N มากกว่า M ใน '-r N: M' หรือใช้ตัวเลือก '-c' พร้อมกับจำนวนลบ: '-c -M' เทียบเท่ากับ '-r M:' การยกเลิกการเปลี่ยนแปลงเช่นนี้เรียกอีกอย่างว่าการทำ "การรวมย้อนกลับ"


  • หากแหล่งที่มาเป็นไฟล์ความแตกต่างจะถูกนำไปใช้กับไฟล์นั้น (มีประโยชน์สำหรับการผสานการเปลี่ยนแปลงก่อนหน้านี้ย้อนกลับ) มิฉะนั้นหากแหล่งที่มาเป็นไดเรกทอรีดังนั้นค่าเริ่มต้นเป้าหมายคือ '.'

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

ตัวอย่าง:

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

สิ่งนี้จะแทนที่สำเนาโลคัล [2983] (ซึ่งตามที่กล่าวไว้ข้างต้นควรซิงค์กับเซิร์ฟเวอร์ - ความรับผิดชอบของคุณ) ด้วยการแก้ไข 289 จากเซิร์ฟเวอร์ การเปลี่ยนแปลงจะเกิดขึ้นในพื้นที่ซึ่งหมายความว่าหากคุณมีการชำระเงินที่สะอาดคุณสามารถตรวจสอบการเปลี่ยนแปลงก่อนดำเนินการได้


-1

ต่อไปนี้ได้ผลสำหรับฉัน

ฉันมีการเปลี่ยนแปลงในท้องถิ่นมากมายและจำเป็นต้องทิ้งสิ่งเหล่านี้ในสำเนาในเครื่องและทำการตรวจสอบรุ่นที่เสถียรล่าสุดใน SVN

  1. ตรวจสอบสถานะของไฟล์ทั้งหมดรวมถึงไฟล์ที่ถูกละเว้น

  2. รวมทุกบรรทัดเพื่อรับไฟล์ที่เพิ่มและละเว้นใหม่

  3. //แทนที่ผู้ที่มี

  4. และ rm -rf ทุกบรรทัด

    สถานะ svn - ไม่ต้องสนใจ | grep '^ [? I]' | sed "s / ^ [? I] //" | xargs -I {} rm -rf "{}"

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