คำตอบทั้งหมดจนถึงขณะนี้ไม่ได้ตอบข้อกังวลต่อท้าย:
มีวิธีที่มีประสิทธิภาพหรือไม่เมื่อมีการแก้ไขหลายร้อยรายการหลังจากที่ลบไปแล้ว?
ขั้นตอนต่อไปนี้ แต่สำหรับการอ้างอิงสมมติว่ามีประวัติต่อไปนี้:
[master] -> [hundreds-of-commits-including-merges] -> [C] -> [R] -> [B]
C : คอมมิชชันเพียงทำตามการคอมมิตที่จะลบ (ล้าง)
R : ความมุ่งมั่นที่จะถูกลบออก
B : กระทำก่อนหน้าที่จะส่งออก (ฐาน)
เนื่องจากข้อ จำกัด "การแก้ไขหลายร้อย" ฉันถือว่าสมมติฐานล่วงหน้าดังต่อไปนี้:
- มีบางอย่างที่น่าละอายที่คุณไม่ต้องการมีอยู่จริง
- มีค่าคอมมิชชันที่ตามมาเป็นศูนย์ที่จริง ๆ แล้วขึ้นอยู่กับการกระทำที่น่าอาย (ไม่มีข้อขัดแย้งในการย้อนกลับ)
- คุณไม่สนใจว่าคุณจะถูกระบุว่าเป็น 'ผู้ส่ง' ของการกระทำหลายร้อยรายการ ('ผู้เขียน' จะได้รับการเก็บรักษาไว้)
- คุณไม่เคยแชร์ที่เก็บ
- หรือคุณมีอิทธิพลต่อคนทุกคนที่เคยโคลนประวัติด้วยความมุ่งมั่นในนั้นเพื่อโน้มน้าวให้พวกเขาใช้ประวัติใหม่ของคุณ
- และคุณไม่สนใจเกี่ยวกับการเขียนประวัติใหม่
นี่เป็นข้อ จำกัด ที่ค่อนข้าง จำกัด แต่มีคำตอบที่น่าสนใจที่ใช้งานได้จริงในกรณีมุมนี้
นี่คือขั้นตอน:
git branch base B
git branch remove-me R
git branch save
git rebase --preserve-merges --onto base remove-me
หากไม่มีความขัดแย้งจริง ๆ สิ่งนี้ควรดำเนินการต่อโดยไม่มีการขัดจังหวะเพิ่มเติม หากมีข้อขัดแย้งคุณสามารถแก้ไขได้และrebase --continueหรือตัดสินใจที่จะอยู่กับความลำบากใจและrebase --abortหรือตัดสินใจที่จะมีชีวิตอยู่เพียงกับความลำบากใจและ
ตอนนี้คุณควรอยู่ในmasterสิ่งที่ไม่ได้ทำR แล้วในนั้นอีกต่อไป saveจุดสาขาที่คุณได้ก่อนในกรณีที่คุณต้องการที่จะคืนดี
วิธีที่คุณต้องการจัดการการถ่ายโอนของคนอื่นไปยังประวัติใหม่ของคุณนั้นขึ้นอยู่กับคุณ คุณจะต้องมีการทำความคุ้นเคยกับstash, และreset --hard cherry-pickและคุณสามารถลบbase, remove-meและsaveสาขา