บางส่วนกระทำด้วยการโค่นล้ม


104

ในกรณีที่ฉันทำการเปลี่ยนแปลงสองอย่างที่เป็นอิสระในไฟล์เดียว : เช่น. เพิ่มวิธีการใหม่และเปลี่ยนวิธีการอื่น

ฉันมักจะไม่ต้องการที่จะกระทำการเปลี่ยนแปลงทั้งในฐานะหนึ่งกระทำ แต่เป็นสองกระทำที่เป็นอิสระ

เมื่อเก็บคอมไพล์ฉันจะใช้โหมดการโต้ตอบของคอมไพล์เพิ่ม (1)การแบ่งก้อนใหญ่เป็นคนเล็ก:

 git add --patch

วิธีที่ง่ายที่สุดในการโค่นล้มคืออะไร? (อาจจะใช้ปลั๊กอิน Eclipse ด้วยซ้ำ)

อัปเดต:
ในThe Thing About Gitไรอันเรียกมันว่า: “ ปัญหาการทำงานแบบ Tangled Working Copy”


คุณกำลังค้นหาโซลูชันบนบรรทัดคำสั่งโดยเฉพาะหรือไม่? คำตอบหลายคำตอบด้านล่างกล่าวถึง TortoiseSVN 'คืนค่าหลังจากกระทำ' ซึ่งเป็นคุณลักษณะเฉพาะของ Tortoise ดังนั้นจึงใช้ GUI และ Windows
florisla

คำตอบ:


35

ด้วย git-svn คุณสามารถสร้างที่เก็บ GIT แบบโลคัลของที่เก็บ SVN ระยะไกลทำงานกับมันโดยใช้ชุดคุณสมบัติ GIT เต็ม (รวมถึงการคอมมิตบางส่วน) จากนั้นดันทั้งหมดกลับไปที่ที่เก็บ SVN

git-svn (1)


25
มีการประชดโดยเฉพาะในการแก้ปัญหานี้
tuxayo

64

ตอนนี้ Tortoise SVN 1.8 รองรับสิ่งนี้แล้วโดยมีคุณสมบัติ "กู้คืนหลังจากกระทำ" วิธีนี้ช่วยให้คุณสามารถแก้ไขไฟล์ได้โดยการแก้ไขทั้งหมดจะถูกยกเลิกหลังจากคอมมิต

ตามเอกสารประกอบ:

ในการคอมมิตเฉพาะส่วนของไฟล์ที่เกี่ยวข้องกับปัญหาเฉพาะ:

  1. ในกล่องโต้ตอบการกระทำคลิกขวาที่ไฟล์เลือก "คืนค่าหลังจากกระทำ"
  2. แก้ไขไฟล์ในเช่น TortoiseMerge: เลิกทำการเปลี่ยนแปลงที่คุณยังไม่ต้องการกระทำ
  3. บันทึกไฟล์
  4. คอมมิตไฟล์

ฉันสงสัยว่ามันทำงานอย่างไร ฉันตรวจสอบบันทึกย่อประจำรุ่น SVN 1.8แล้ว แต่ฉันไม่สามารถเข้าใจได้ว่าคุณลักษณะ "กู้คืนหลังจากกระทำ" เป็นอย่างไร
DavidS

3
@DavidS นี่ไม่ใช่คุณสมบัติของ SVN เป็นคุณสมบัติของ TortoiseSVN
florisla

FYI, SVN 1.8 คือ EOL ตั้งแต่เดือนเมษายน 2018 โดยเปิดตัว 1.10
Greg K

นอกจากนี้เรายังสามารถค้นหาได้ในเอกสารที่นี่: tortoisesvn.net/docs/release/TortoiseSVN_en/…
Guillaume

42

ฉันได้กระทำนี้ใช้TortoiseSVN

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

ใช้ฟังก์ชันสร้างการสำรองข้อมูลของยูทิลิตี้ diff

  1. ไปคอมมิตไฟล์ของคุณราวกับว่าคุณกำลังจะทำการเปลี่ยนแปลงทั้งหมดของคุณ
  2. ในหน้าต่างคอมมิตดับเบิลคลิกที่ไฟล์เพื่อแสดงความแตกต่าง
  3. ในการตั้งค่าต่างให้คลิกตัวเลือกให้ไฟล์ต้นฉบับสำรอง
  4. คลิกขวาที่การเปลี่ยนแปลงที่คุณไม่ต้องการและใช้เลือกใช้บล็อกข้อความอื่น
  5. บันทึก diff ครั้งว่า ข้อมูลสำรองจะถูกเขียนทับทุกครั้งที่คุณบันทึก นี่คือเหตุผลที่คุณต้องการบันทึกเพียงครั้งเดียว
  6. ยอมรับการเปลี่ยนแปลง
  7. เขียนทับต้นฉบับด้วยไฟล์. Bak ที่สร้างขึ้น (ซึ่งจะมีการเปลี่ยนแปลงเดิมทั้งหมดของคุณ)
  8. ยอมรับไฟล์ของคุณ

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


1
คุณทำสิ่งนี้ได้อย่างไร? ฉันสนใจที่จะเรียนรู้เทคนิคนั้น
Lasse V.Karlsen

มันจะดีมากถ้าสิ่งนี้จะเขียนทับด้วยไฟล์. Bak โดยอัตโนมัติหลังจากคอมมิต
BCS

ฉันไม่พบขั้นตอนที่ 3: ตัวเลือกสำรองโดยใช้ Tortoise SVN 1.8.1
sudhAnsu63

4
ไม่เป็นไร. พบลิงก์ coresponding สำหรับ 1.8 tortoisesvn.net/tsvn_1.8_releasenotes.html ในการคอมมิตเฉพาะส่วนของไฟล์ที่เกี่ยวข้องกับปัญหาเฉพาะ: ในไดอะล็อกคอมมิตให้คลิกขวาที่ไฟล์เลือก "กู้คืนหลังจากคอมมิต" แก้ไขไฟล์ เช่น TortoiseMerge: ยกเลิกการเปลี่ยนแปลงที่คุณไม่ต้องการกระทำ แต่บันทึกไฟล์ส่งไฟล์
sudhAnsu63

น่าเศร้าที่สิ่งนี้ดูเหมือนจะไม่มีใน Tortoise เวอร์ชัน 1.8.5 และไม่มีการ "คืนค่าหลังจากกระทำ"
kajaco

24

ลองใช้svn diff > out.patchแล้วคัดลอกout.patchไฟล์ไปที่out.patch.addและout.patch.modify

เฉพาะเมื่อคุณมีไฟล์แพตช์ที่ใช้งานได้จะเปลี่ยนไฟล์ต้นฉบับโดยใช้svn revert out.c.

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

ล้างล้างซ้ำสำหรับout.patch.modifyแพทช์

หากการเปลี่ยนแปลงแยกจากกันในไฟล์ตามคำถามเริ่มต้นของคุณ - เพิ่มวิธีการใหม่เปลี่ยนวิธีการที่มีอยู่วิธีนี้จะได้ผล

นี่เป็นวิธีแก้ปัญหาที่น่าเบื่อมาก - แม้ว่าฉันจะไม่มั่นใจว่าคุณควรมีเหตุผลในการแยกการกระทำของคุณออกจากกัน

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

svn co http://location/repository methodAdd

svn co http://location/repository methodModify

อย่าลืมsvn upและทดสอบเพื่อให้แน่ใจว่าทุกอย่างเรียบร้อยดี


10

สามารถทำได้โดยใช้ TortoiseSvn (Windows) ตั้งแต่ v1.8

4.4.1. กล่องโต้ตอบ Commit

หากสำเนาการทำงานของคุณเป็นปัจจุบันและไม่มีข้อขัดแย้งคุณก็พร้อมที่จะยอมรับการเปลี่ยนแปลงของคุณ เลือกไฟล์และ / หรือโฟลเดอร์ที่คุณต้องการคอมมิตจากนั้น TortoiseSVN → Commit ....

<snip>

4.4.3. คอมมิตเฉพาะบางส่วนของไฟล์

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

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

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

บน Linux ฉันจะลองhttp://webstaff.itn.liu.se/~karlu20/div/blog/2013-05-31_SVNPartialCommit.php ยังไม่ได้ลองด้วยตัวเองแม้ว่า


8

ฉันเคยทำสิ่งนี้:

  • ในโปรแกรมแก้ไขของฉัน (ฉันใช้ vim) แก้ไขไฟล์เพื่อให้การเปลี่ยนแปลงปรากฏขึ้นเพียงรายการเดียว
  • บันทึกไฟล์ (แต่อย่าออกจากโปรแกรมแก้ไข)
  • ยอมรับไฟล์ที่เปลี่ยนแปลงเป็น svn
  • กด "เลิกทำ" ในเครื่องมือแก้ไขหลายครั้งเพียงพอที่การเปลี่ยนแปลงชุดที่สองจะปรากฏขึ้นอีกครั้ง
  • บันทึกไฟล์อีกครั้ง
  • ยอมรับการเปลี่ยนแปลงชุดที่สอง

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

ตอนนี้ฉันใช้คอมไพล์แล้วนี่คือสิ่งที่ฉันหวังว่าฉันจะไม่ต้องทำอีก!


4

ฉันใช้ repo darcs ในพื้นที่หรือเพียงแค่ผสานการเปลี่ยนแปลงทีละน้อย ด้วยการผสาน (opendiff เปิด FileMerge ซึ่งเป็นโปรแกรมผสานที่มาพร้อมกับ Xcode แทนที่ด้วยเครื่องมือผสานที่คุณชื่นชอบ):

cp file file.new
svn revert file
opendiff file.new file -merge file

ผสานการเปลี่ยนแปลงที่เกี่ยวข้องบันทึกการผสานออกจากโปรแกรมผสาน

svn ci -m 'first hunk' file
mv file.new file
svn ci -m 'second hunk' file

หากมีก้อนที่ไม่เกี่ยวข้องมากกว่าหนึ่งชิ้นในไฟล์ให้ล้างและทำซ้ำ (แต่ทำไมคุณต้องรอนานก่อนที่จะตกลง!)

นอกจากนี้หากคุณรู้จักคอมไพล์คุณสามารถใช้git-svnเพื่อรักษา git repo ในเครื่องและซิงค์คอมมิตของคุณกับเซิร์ฟเวอร์หลัก svn ใช้งานได้ดีในประสบการณ์ที่ จำกัด ของฉัน


9
Re: ทำไมรอนานจัง? คุณทำการรีแฟคเตอร์ขนาดใหญ่ตลอดทั้งวันและหัวหน้าลดข้อผิดพลาดเล็กน้อยในตอนนี้ก่อนอาหารกลางวัน
BCS

4

ลองVisualSVN สำหรับ Visual Studio ล่าสุด 6.1 ปล่อยแนะนำคุณลักษณะ QuickCommit คุณสามารถยอมรับการเปลี่ยนแปลงที่เลือกบางส่วนในไฟล์โดยใช้คำสั่งเมนูบริบทCommit this BlockและCommit Selection ใหม่ในโปรแกรมแก้ไข Visual Studio

ป้อนคำอธิบายภาพที่นี่


2
  1. เปิดไฟล์ทั้งหมดที่คุณต้องการแยกในตัวแก้ไขที่เลือก
  2. ใช้ชุดเครื่องมืออื่น (ใน Win ให้ใช้คำแนะนำของ Spike (เวอร์ชันเก่า)) สำรองชุดที่สอง
  3. กระทำ
  4. กลับไปที่ตัวแก้ไขที่คุณเลือกและบันทึกไฟล์ทั้งหมด

มีความเสี่ยงน้อยกว่าคำแนะนำทั้งหมดของ Spike แต่สามารถทำได้ง่ายกว่า ตรวจสอบให้แน่ใจว่าคุณได้ลองใช้อย่างอื่นก่อนเนื่องจากบรรณาธิการบางคนจะปฏิเสธที่จะบันทึกไฟล์ที่มีการเปลี่ยนแปลงจากไฟล์เหล่านั้นเว้นแต่คุณจะโหลดไฟล์นั้นซ้ำ (สูญเสียการเปลี่ยนแปลงทั้งหมด)


0

ฉันคิดว่าตัวเลือกที่ง่ายกว่าการสร้างไฟล์ diff การเปลี่ยนกลับ ฯลฯ คือต้องมีการเช็คเอาต์ที่เก็บสองสำเนาและใช้เครื่องมือ Visual diff เช่น DeltaWalker เพื่อคัดลอก hunks จากที่หนึ่งไปยังอีกที่หนึ่ง

สำเนาแรกจะเป็นสำเนาที่คุณใช้งานได้จริงและสำเนาที่สองจะใช้เพื่อจุดประสงค์นี้ เมื่อคุณได้ทำการเปลี่ยนแปลงในส่วนแรกเป็นจำนวนมากแล้วคุณสามารถคัดลอกส่วนหนึ่งไปยังส่วนที่สองกระทำมันคัดลอกส่วนอื่นกระทำมัน ฯลฯ


0
  1. คัดลอกไฟล์ที่แก้ไขทั้งหมดที่เกี่ยวข้องกับสำเนาสำรอง
  2. svn diffสร้างแพทช์ของสถานะการทำงานโดยใช้
  3. คืนไฟล์โดยใช้svn revert.
  4. นำส่วนต่างๆของแพตช์ที่คุณต้องการกลับมาใช้ใหม่ไม่ว่าจะโดยใช้patchเครื่องมือหรือโดยการแก้ไขด้วยตนเองหรืออะไรก็ตาม
  5. เรียกใช้diffหลังจากนั้นเพื่อเปรียบเทียบสำเนาการทำงานของคุณกับการสำรองข้อมูลเพื่อให้แน่ใจว่าคุณใช้ส่วนแพตช์อย่างถูกต้อง
  6. สร้างและทดสอบ
  7. กระทำ
  8. คัดลอกสำเนาสำรองของคุณกลับไปที่การชำระเงินที่เก็บของคุณ
  9. ทำซ้ำที่ 2 (ไม่ใช่ที่ 1!) จนเสร็จ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.