ฉันเพิ่งเขียนบล็อกเมื่อไม่นานมานี้ในหัวข้อนี้:
เราจะทำให้สาขาคุณลักษณะนี้ทันสมัยอยู่เสมอได้อย่างไร การรวมการคอมมิตต้นน้ำใหม่ล่าสุดเป็นเรื่องง่าย แต่คุณต้องการหลีกเลี่ยงการสร้างคอมมิตการผสานเนื่องจากจะไม่ได้รับการชื่นชมเมื่อถูกผลักไปที่ต้นน้ำ: จากนั้นคุณจะทำการเปลี่ยนแปลงต้นน้ำใหม่อย่างมีประสิทธิภาพและการดำเนินการในขั้นต้นเหล่านั้นจะได้รับแฮชใหม่ ( เมื่อพวกเขาได้พ่อแม่คนใหม่) นี่เป็นสิ่งสำคัญอย่างยิ่งเนื่องจากการคอมมิตที่รวมเข้าด้วยกันจะแสดงในคำขอดึง GitHub ของคุณเมื่อคุณส่งการอัปเดตเหล่านั้นไปยังสาขาคุณลักษณะ GitHub ส่วนตัวของคุณ (แม้ว่าคุณจะทำเช่นนั้นหลังจากที่คุณออกคำขอดึง)
นั่นเป็นเหตุผลที่เราต้องทำการ rebase แทนการรวม:
git co devel #devel is ansible's HEAD aka "master" branch
git pull --rebase upstream devel
git co user-non-unique
git rebase devel
ทั้งตัวเลือก rebase และคำสั่ง rebase ไปยัง git จะทำให้ทรีของคุณสะอาดและหลีกเลี่ยงการรวมคอมมิต แต่โปรดทราบว่าสิ่งเหล่านี้เป็นการกระทำครั้งแรกของคุณ (ซึ่งคุณได้ออกคำขอดึงครั้งแรกของคุณ) ที่กำลังถูกปรับใหม่และตอนนี้มีการคอมมิตใหม่ซึ่งแตกต่างจากแฮชเดิมที่ยังอยู่ในสาขา repo github ระยะไกลของคุณ .
ตอนนี้การส่งการอัปเดตเหล่านั้นออกไปยังสาขาคุณลักษณะ GitHub ส่วนบุคคลของคุณจะล้มเหลวในที่นี้เนื่องจากทั้งสองสาขาแตกต่างกัน: แผนผังสาขาในพื้นที่และแผนผังสาขาระยะไกล "ไม่ตรงกัน" เนื่องจากการแฮชคอมมิตที่แตกต่างกัน Git จะบอกคุณก่อนgit pull --rebase
แล้วจึงกดอีกครั้ง แต่นี่จะไม่ใช่การกดไปข้างหน้าแบบง่ายๆเนื่องจากประวัติของคุณถูกเขียนใหม่ อย่าทำอย่างนั้น!
ปัญหาคือคุณจะดึงการเปลี่ยนแปลงครั้งแรกของคุณอีกครั้งเหมือนเดิมและสิ่งเหล่านี้จะรวมเข้ากับสาขาในพื้นที่ของคุณ เนื่องจากสถานะไม่ซิงค์การดึงนี้จึงใช้ไม่ได้ทั้งหมด คุณจะได้รับประวัติเสียซึ่งการกระทำของคุณปรากฏขึ้นสองครั้ง เมื่อคุณส่งข้อมูลทั้งหมดนี้ไปยังสาขาฟีเจอร์ GitHub ของคุณการเปลี่ยนแปลงเหล่านั้นจะสะท้อนให้เห็นในคำขอดึงเดิมซึ่งจะน่าเกลียดมาก
AFAIK ไม่มีวิธีแก้ปัญหานี้โดยสิ้นเชิง ทางออกที่ดีที่สุดที่ฉันพบคือบังคับให้ส่งสาขาในพื้นที่ของคุณไปยังสาขา GitHub ของคุณ (บังคับให้อัปเดตแบบไม่กรอไปข้างหน้า):
ตาม git-push (1):
Update the origin repository’s remote branch with local branch, allowing non-fast-forward updates. This can leave unreferenced commits dangling in the origin repository.
ดังนั้นอย่าดึงเพียงแค่ออกแรงผลักดังนี้:
git push svg +user-non-unique
หรือ:
git push svg user-non-unique --force
สิ่งนี้จะเขียนทับสาขาระยะไกลของคุณอย่างชัดเจนโดยทุกอย่างในสาขาในพื้นที่ของคุณ คอมมิตที่อยู่ในสตรีมระยะไกล (และทำให้เกิดความล้มเหลว) จะยังคงอยู่ที่นั่น แต่จะเป็นการคอมมิตแบบห้อยซึ่งจะถูกลบโดย git-gc (1) ในที่สุด ไม่ใช่เรื่องใหญ่.
อย่างที่บอกว่า AFAICS เป็นโซลูชันที่สะอาดที่สุด ข้อเสียของสิ่งนี้คือ PR ของคุณจะได้รับการอัปเดตด้วยการกระทำใหม่ล่าสุดเหล่านั้นซึ่งจะได้รับในภายหลังและอาจปรากฏไม่ตรงกันในประวัติความคิดเห็นของ PR ไม่มีปัญหาใหญ่ แต่อาจทำให้สับสนได้