Magit แยกก้อนใหญ่ออกเป็นสองก้อน


34

มีคำถามเกี่ยวกับเกี่ยวกับ hunks แยกโดยใช้ magit เอและทั้งสองได้รับการแก้ปัญหาเป็นไปขั้นตอนทั้งภูมิภาค (ทำเครื่องหมายภูมิภาคเวทีตี) หรือหดตัว / เติบโต hunks ทั้งหมดที่ใช้และ+ -นั่นไม่ใช่สิ่งที่ฉันตามมา

ในบัฟเฟอร์สถานะของ magit ฉันต้องการแยกก้อนใหญ่ออกเป็นสอง hunks ณ จุดนั้นหรืออย่างน้อยก็ที่เส้นรอบจุด

เปลี่ยนเป็น (แก้ตัวการจัดรูปแบบ diff ของฉันไม่ดี)

@@ blah blah blah
- foo
+ bar
+ baz
+

เข้าไป

@@ blah blah
- foo
+ bar

@ blah blah
+ baz

เมื่อแต้มอยู่บนแถบ

แรงจูงใจ:

  • bazเป็นคำสั่ง debug ดังนั้นฉันต้องการลบมันจากคำสั่งfoo& barโดยไม่ต้องกำจัดมัน

  • barและbazเกี่ยวข้องเพียงบางส่วนเท่านั้นซึ่งหมายความว่าการเปลี่ยนแปลงของพวกเขาไม่ควรกระทำเช่นเดียวกัน

  • barมีขนาดใหญ่และbazเล็กทำให้ง่ายกว่าที่จะแยกก้อนใหญ่แทนที่จะเลือกbar

  • คล้ายกับจุดสุดท้ายบอกว่าคอมมิชชัน 20 ไลน์มีเส้นตรงกลางที่ไม่ควรจัดฉาก มันจะง่ายกว่าที่จะแยก & จัดลำดับนักล่าสองคนที่อยู่ด้านบนและล่างโดยไม่สนใจตรงกลางมากกว่าใช้พื้นที่

  • ข้างต้นสามารถเกิดขึ้นได้ในบางครั้งเมื่อการนำเสนอที่แตกต่างจะแยกส่วนก่อนและหลังของบางสิ่งที่ได้รับการแก้ไขและมีสิ่งที่ไม่ช่วยเหลือตรงกลาง เช่น

@@ line
- old_foo
+ random stuff
+ new foo

ไม่มีเวทในเวทมนต์ที่สามารถทำสิ่งนี้ได้ ยิ่งไปกว่านั้น: การออกแบบของ magit ทำให้สิ่งนี้เป็นไปไม่ได้ในการเขียนโค้ดโดยไม่มีการออกแบบใหม่ของสถานะ magit
Rémi

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

น่าสนใจโดยเลือก 2 ส่วนที่แตกต่างซึ่งไม่ใช่ภาคผนวก +1
Nsukami _

1
โดยส่วนตัวแล้วฉันจะแสดงก้อนใหญ่ทั้งหมดแล้วยกเลิกงบแก้จุดบกพร่อง (ของฉันก่อนกระทำการจับตะขอฉากงบแก้ปัญหาเพื่อให้มีอันตรายจากการฉันการกระทำอย่างใดอย่างหนึ่ง.)
Phils

1
ฉันไม่รู้มากพอเกี่ยวกับ Magit ที่จะช่วยเหลือ แต่ฉันแค่ต้องการชี้ให้เห็นว่าโหมดต่าง ๆ ของ Emacs มีคำสั่งdiff-split-hunkที่ทำเช่นนั้น IOW คำขอของคุณมีไว้สำหรับวิธีการใช้diff-split-hunk(หรือสิ่งที่เทียบเท่า) จากบัฟเฟอร์ magit-status
สเตฟาน

คำตอบ:


17

ตามที่ระบุไว้ในความคิดเห็นข้างต้น Magit ไม่แยกไม่สนับสนุนก้อนใหญ่เข้า hunks git diff -U<n>หลายเกินกว่าสิ่งที่เป็นไปได้โดยใช้ นั่นเป็นเพราะ Magit อาศัยคำสั่ง Git นั้นเพื่อสร้างส่วนต่าง นั่นจะไม่เปลี่ยนแปลง Magit จะใช้ diffs ที่ได้รับจาก Git ตามที่เป็นอยู่เสมอ

(อันที่จริงแล้ว Magit ดึงส่วนหัวบางส่วนที่ไม่เกี่ยวข้องกับมนุษย์ แต่คืนค่าพวกเขาเมื่อใช้การเปลี่ยนแปลง แต่การแยกก้อนก้อนใหญ่กว่าสิ่งที่-U<n>รองรับคือเรื่องราวที่แตกต่างกันทั้งหมดมันจะนำไปสู่หลุมกระต่าย - มีเหตุผลว่าทำไม Git ไม่อนุญาต "hunks ที่เล็กกว่า" มันจะไม่สามารถใช้กับมันได้)

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

มันไม่ได้ช่วยอะไรมากนักเมื่อส่วนที่ไม่ควรจัดฉากอยู่ตรงกลางของข้อความที่ควรจัดฉาก อย่างที่คนอื่น ๆ แนะนำไว้สิ่งที่คุณควรทำในกรณีนี้คือการจัดการเวทีก้อนใหญ่ทั้งหมดแล้วยกเลิกการต่อแถวที่คุณไม่ต้องการผูกมัดในขั้นตอนที่สอง

แน่นอนว่าอาจเป็นไปโดยอัตโนมัติ วิธีเดียวที่ฉันเห็นว่าสิ่งนี้อาจเป็นแบบอัตโนมัติคือ "จัดวางก้อนใหญ่ในปัจจุบันยกเว้นในภูมิภาค แต่ฉันมีข้อสงสัยเกี่ยวกับความถี่ที่จะมีประโยชน์จริง ๆ และกลัวว่ามันจะไม่ง่ายที่จะติดตั้งอย่างแน่นหนา ดังนั้นตอนนี้ฉันไม่ได้ตั้งใจจะใช้สิ่งนี้


47

คุณสามารถแยก hunks ด้วย Magit

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

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


3
IMO นี่ควรเป็นคำตอบที่ได้รับการยอมรับเนื่องจากเป็นไปตามคำขอ (และฉันได้พบคำตอบนี้สองสามครั้งเมื่อพยายามจดจำวิธีการทำสิ่งนี้)
chaseadamsio

2
ใช่สิ่งนี้ควรได้รับการยอมรับว่าเป็นคำตอบ!
copyninja

3

หากคุณต้องการชิ้นส่วนทิ้งของก้อนใหญ่ให้เลือกเส้นที่อยู่ภายในก้อนใหญ่ที่คุณต้องการจะทิ้งและกดx

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