คำขอดึงสควอชนั้นทำลายอัลกอริธึมการผสานของคอมไพล์หรือไม่


17

ฉันกำลังทำงานให้กับ บริษัท ที่ใช้ VSTS ในการจัดการรหัส git วิธีการ "แนะนำ" ของ Microsoft ในการผสานสาขาคือการทำ "ผสานสควอช" ซึ่งหมายความว่าการคอมมิชชันทั้งหมดสำหรับสาขานั้นจะถูกบีบให้เป็นคอมมิชชันใหม่ที่รวมการเปลี่ยนแปลงทั้งหมด

ปัญหาคือถ้าฉันทำการเปลี่ยนแปลงบางอย่างในสาขาหนึ่งสำหรับรายการค้างหนึ่งรายการทันทีต้องการเริ่มทำการเปลี่ยนแปลงในสาขาอื่นสำหรับรายการค้างอื่นและการเปลี่ยนแปลงเหล่านั้นขึ้นอยู่กับชุดการเปลี่ยนแปลงของสาขาแรก

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

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

คำตอบ:


15

ด้วย Git

  • ไม่เปลี่ยนรูป
  • และจัดทำกราฟ acyclic โดยตรง

การบีบอัดไม่ได้รวมการกระทำ แต่จะบันทึกการกระทำใหม่ด้วยการเปลี่ยนแปลงจากการกระทำอื่น ๆ การรีบูตคล้ายกัน แต่ไม่รวมการคอมมิท บันทึกใหม่กระทำกับการเปลี่ยนแปลงเช่นเดียวกับที่มีอยู่กระทำที่เรียกว่าการเขียนประวัติศาสตร์ แต่เนื่องจากความมุ่งมั่นที่มีอยู่นั้นไม่เปลี่ยนแปลงสิ่งนี้ควรเข้าใจว่าเป็นการ“ เขียนประวัติศาสตร์ทางเลือก”

การผสานพยายามรวมการเปลี่ยนแปลงของประวัติศาสตร์ของสองกระทำ (สาขา) เริ่มต้นจากการกระทำที่บรรพบุรุษร่วมกัน

ดังนั้นให้ดูประวัติของคุณ:

                                 F  feature2
                                /
               1---2---3---4---5    feature1 (old)
              /
-o---o---o---A---o---o---S          master

A คือบรรพบุรุษทั่วไป, 1-5 สาขาฟีเจอร์ดั้งเดิม, F สาขาฟีเจอร์ใหม่, และ S การกระทำที่ถูกแบนที่มีการเปลี่ยนแปลงเช่นเดียวกับ 1-5 อย่างที่คุณเห็นบรรพบุรุษของ F และ S คือ A. ตราบใดที่ git เกี่ยวข้องก็ไม่มีความสัมพันธ์ระหว่าง S และ 1-5 ดังนั้นการผสานต้นแบบกับ S ในด้านหนึ่งและ Feature2 กับ 1–5 ในอีกด้านหนึ่งจะขัดแย้งกัน การแก้ไขข้อขัดแย้งเหล่านี้ไม่ใช่เรื่องยาก แต่เป็นงานที่ไม่จำเป็นและน่าเบื่อ

เนื่องจากข้อ จำกัด เหล่านี้มีสองวิธีในการจัดการกับการรวม / การบีบ:

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

                                     F  feature2 (old)
                                    /
                   1---2---3---4---5    feature1 (old)
                  /
    -o---o---o---A---o---o---S          master
                              \
                               F'       feature2
    
  • หรือคุณไม่ใช้การเขียนประวัติใหม่ซึ่งในกรณีนี้คุณอาจได้รับการรวมพิเศษ:

                                     F  feature2
                                    /
                   1---2---3---4---5    feature1 (old)
                  /                 \
    -o---o---o---A---o---o-----------M  master
    

    เมื่อ feature2 และ master ถูกผสานเข้าด้วยกันบรรพบุรุษจะถูกคอมมิต 5

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

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

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


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

@Jez นั่นคือสิ่งที่เกิดขึ้นเมื่อคุณสควอช PR ฉันเพิ่งต้องเขียน PR ด้วยตัวเองอีกครั้งในโครงการ OSS (โดยgit cloneการซื้อซ้ำและคัดลอกไฟล์การเปลี่ยนแปลงของฉันไป!) เพราะฉันแยกสาขาจากสาขาจากนั้นผู้ดูแลบีบสาขาแรก ที่งานของฉันพวกเขายังรวมสควอช ซึ่งหมายความว่าฉันไม่สามารถใช้งานคุณสมบัติbที่ขึ้นอยู่กับคุณสมบัติaจนกว่าaจะรวมคุณสมบัติ
ทิ้งบัญชี

1
และนั่นไม่ใช่ความแตกแยกที่น่ารำคาญจริงๆของบางสิ่งบางอย่างที่อาจเป็นไปได้เพราะ git ถูกออกแบบมาเพื่อ? ดูฉันเห็นองค์กรต่าง ๆ เช่น Microsoft และ Github แนะนำการรวมสควอชเหล่านี้จริง ๆ แล้วพวกเขาดูเป็นใบ้กับฉัน
Jez

1
@Jez ในสถานการณ์ดั้งเดิมใช่คุณจะได้รับข้อขัดแย้งเมื่อรวม feature2 เข้ากับ master เนื่องจากการรวมคอมมิชชัน 1–5 จะขัดแย้งกับการเปลี่ยนแปลงเดียวกันใน S วิธีแก้ปัญหาคือรีบูท feature2 (โซลูชัน 1) หรือไม่ใช้การบีบอัด / รีบูตที่ ทั้งหมด (โซลูชัน 2)
amon

การผสานสควอชนั้นเหมาะกับคุณหรือไม่นั้นขึ้นอยู่กับสิ่งที่คุณต้องการบันทึกในประวัติการควบคุมเวอร์ชัน ถ้าสาขาคุณลักษณะมี WIP ที่ยอมรับหลายรายการการบีบจะทำให้การคอมมิตใหญ่ด้วยฟีเจอร์ที่สมบูรณ์ในสาขาหลัก หากคุณต้องการสงวนคนกลางที่กระทำการของฟีเจอร์สาขาให้ใช้การรีบูตหรือการรวม
amon

11

การรวมสควอชเป็นการแบ่งอัลกอริทึมการรวมสำหรับสาขาใด ๆ ที่มีคอมมิชชันใด ๆ ที่ถูกลบออกโดยสควอช อีกวิธีหนึ่งการคืนชีพเป็นไวรัส หากคุณรีบูทหนึ่งสาขาคุณต้องรีบูทสาขาอื่นที่ขึ้นอยู่กับสาขานั้น หากคุณใช้rerereความขัดแย้งผสานที่คุณแก้ไขด้วยตนเองใน repo ในพื้นที่ของคุณไม่จำเป็นต้องแก้ไขด้วยตนเองอีกครั้ง แต่นั่นไม่ได้ช่วยแก้ปัญหาความขัดแย้งที่แก้ไขโดยคนอื่น

นั่นเป็นสาเหตุที่กฎที่ไม่ได้เขียนไว้ของเราที่นี่คือการสควอชตราบใดที่ไม่มีใครขึ้นอยู่กับสาขาฟีเจอร์ของคุณซึ่งอาจเป็น 90% ของเวลา มิฉะนั้นการผสานแบบตรงจะช่วยให้ทุกคนหลีกเลี่ยงปัญหา


วิธีหนึ่งที่จะให้ทั้งสควอชคอมมิทในประวัติต้นแบบและฟีเจอร์แบรนช์เหมือนเดิมเพื่อแยกสควอชเท่านั้น สมมติว่าคุณมีfeature-xyzสาขา คุณสามารถสร้างfeature-xyz-squashedสาขาเริ่มต้นที่เดียวกันกระทำเป็นfeature-xyzสาขาgit cherry-pickกระทำจากfeature-xyzไปfeature-xyz-squashed, สควอชพวกเขามีและการผสานไปfeature-xyz-squashed masterคุณไม่ควรรวมfeature-xyzตอนนั้น บางครั้งข้างต้นทำให้รู้สึก (เช่นคุณไม่ต้องการรวม commits กับรหัสผ่านใน) แต่มันเป็นวิธีการแก้ปัญหาแทบจะไม่ปฏิบัติที่ดีที่สุด
9000
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.