ฉันพบคำอธิบายที่ดีเกี่ยวกับวิธีการเปลี่ยนกลับผสานจากลิงก์นี้และฉันคัดลอกวางคำอธิบายด้านล่างและจะเป็นประโยชน์ในกรณีที่ลิงก์ด้านล่างใช้งานไม่ได้
วิธีเปลี่ยนกลับการผสานที่ผิดพลาด
Alan (alan@clueserver.org) กล่าวว่า:
ฉันมีสาขาหลัก เรามีสาขาที่แตกต่างจากที่นักพัฒนาบางคนกำลังทำงานอยู่ พวกเขาอ้างว่าพร้อม เรารวมมันเข้าไปในสาขาหลัก มันทำลายบางอย่างดังนั้นเราจึงคืนค่าการผสาน พวกเขาทำการเปลี่ยนแปลงรหัส พวกเขาไปถึงจุดที่พวกเขาบอกว่ามันโอเคและเรารวมอีกครั้ง เมื่อตรวจสอบเราพบว่าการเปลี่ยนแปลงรหัสที่ทำก่อนการเปลี่ยนกลับไม่อยู่ในสาขาหลัก แต่การเปลี่ยนแปลงรหัสหลังจากอยู่ในสาขาหลัก และขอความช่วยเหลือในการแก้ไขสถานการณ์นี้
ประวัติทันทีหลังจาก "การคืนค่าการผสาน" จะมีลักษณะเช่นนี้:
---o---o---o---M---x---x---W
/
---A---B
ที่ A และ B อยู่ด้านการพัฒนาที่ไม่ดี M คือการรวมที่นำการเปลี่ยนแปลงก่อนกำหนดเหล่านี้เข้าสู่การฉีด, x คือการเปลี่ยนแปลงที่ไม่เกี่ยวข้องกับสิ่งที่สาขาด้านข้างได้ทำและทำการฉีดแล้วและ W คือ " การคืนค่าการผสาน M "(จะไม่ดู W M คว่ำหรือไม่) IOW "diff W ^ .. W" คล้ายกับ "diff -RM ^ .. M"
"ย้อนกลับ" ของการรวมสามารถทำได้ด้วย:
$ git revert -m 1 M
หลังจากผู้พัฒนาสาขาแก้ไขความผิดพลาดประวัติอาจมีลักษณะเช่นนี้:
---o---o---o---M---x---x---W---x
/
---A---B-------------------C---D
โดยที่ C และ D จะต้องแก้ไขสิ่งที่เสียหายใน A และ B และคุณอาจมีการเปลี่ยนแปลงอื่น ๆ ในการฉีดหลังจาก W.
หากคุณรวมสาขาด้านที่อัปเดต (ด้วย D ที่ส่วนปลาย) การเปลี่ยนแปลงใด ๆ ที่ทำใน A หรือ B จะไม่เกิดขึ้นเพราะพวกเขาถูกคืนค่าโดย W. นั่นคือสิ่งที่ Alan เห็น
Linus อธิบายสถานการณ์:
การคืนค่าการกระทำปกติเพียงแค่ยกเลิกสิ่งที่กระทำได้อย่างมีประสิทธิภาพและค่อนข้างตรงไปตรงมา แต่การคืนค่าการรวมจะกระทำเพื่อยกเลิกข้อมูลที่กระทำการเปลี่ยนแปลง แต่มันไม่มีผลใด ๆ กับผลกระทบต่อประวัติศาสตร์ที่ผสาน ดังนั้นการผสานจะยังคงอยู่และจะยังคงถูกมองว่าเป็นการรวมสาขาทั้งสองเข้าด้วยกันและการรวมในอนาคตจะเห็นว่าการผสานนั้นเป็นสถานะที่ใช้ร่วมกันครั้งสุดท้าย - และการคืนค่าที่การคืนค่าการผสานที่นำมาใช้ ดังนั้น "ย้อนกลับ" จะยกเลิกการเปลี่ยนแปลงข้อมูล แต่ก็เป็นอย่างมากไม่"เลิกทำ" ในแง่ที่ว่ามันจะไม่เลิกทำการเอฟเฟ็กต์การคอมมิทบนประวัติของที่เก็บ ดังนั้นหากคุณคิดว่า "เปลี่ยนกลับ" เป็น "เลิกทำ" คุณจะพลาดการแปลงกลับเป็นส่วนหนึ่งเสมอ ใช่มันเลิกทำข้อมูล แต่ไม่ใช่มันไม่ได้เลิกทำประวัติ ในสถานการณ์เช่นนี้คุณจะต้องการคืนค่าการย้อนกลับก่อนหน้านี้ก่อนซึ่งจะทำให้ประวัติมีลักษณะดังนี้:
---o---o---o---M---x---x---W---x---Y
/
---A---B-------------------C---D
โดยที่ Y คือการเปลี่ยนกลับของ W. การ "ย้อนกลับของการเปลี่ยนกลับ" เช่นนี้สามารถทำได้ด้วย:
$ git revert W
ประวัตินี้จะ (ไม่สนใจความขัดแย้งที่เป็นไปได้ระหว่างสิ่งที่ W และ W..Y เปลี่ยนแปลง) เทียบเท่ากับการไม่มี W หรือ Y เลยในประวัติศาสตร์:
---o---o---o---M---x---x-------x----
/
---A---B-------------------C---D
และการรวมสาขาอีกครั้งจะไม่มีความขัดแย้งเกิดขึ้นจากการย้อนกลับและเปลี่ยนกลับ
---o---o---o---M---x---x-------x-------*
/ /
---A---B-------------------C---D
แน่นอนการเปลี่ยนแปลงใน C และ D ยังคงสามารถขัดแย้งกับสิ่งที่ทำโดย x ใด ๆ แต่นั่นเป็นเพียงความขัดแย้งผสานปกติ