เหตุใดการผสาน 3 ทางจึงได้เปรียบกว่าการรวมแบบสองทาง


165

Wikipediaกล่าวว่าการผสาน 3 ทิศทางนั้นมีข้อผิดพลาดน้อยกว่าการรวมแบบสองทางและบ่อยครั้งที่ผู้ใช้ไม่ต้องการการแทรกแซง ทำไมเป็นกรณีนี้

ตัวอย่างที่ประสบความสำเร็จในการรวม 3 ทางและการรวม 2 ทางล้มเหลวจะเป็นประโยชน์

คำตอบ:


259

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

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

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


“ แต่มันจะรู้ได้อย่างไรว่าจะทำอย่างไรกับความแตกต่าง” ไม่เข้าใจ หากสามารถเห็นความแตกต่างระหว่างไฟล์ทั้งสองแล้ว (โดยไม่มีการอ้างอิงถึงต้นฉบับ) ทำไมจึงไม่สามารถใช้การเปลี่ยนแปลงทั้งสองแบบตามลำดับเพื่อเพิ่มการประทับเวลาของไฟล์ นั่นคือ: มันเริ่มต้นจากสำเนาที่เพื่อนของฉันให้ไว้เป็นต้นฉบับ (ใหม่) (ด้วยการเพิ่มบรรทัดที่ด้านบน) จากนั้นก็ใช้การเปลี่ยนแปลงในท้องถิ่นของฉัน (การลบบรรทัดที่กระดุม)
แฮร์รี่

7
@ แฮร์รี่พูดว่าต้นฉบับมีสามบรรทัด (ABC) มันเริ่มต้นด้วยสำเนาของเพื่อน (ABCD) และเปรียบเทียบกับของฉัน (BC) โดยไม่เห็นต้นฉบับอาจคิดว่าฉันลบทั้ง A และ D และผลลัพธ์สุดท้ายควรเป็น BC
เจดับบลิว

80

สไลด์นี้จากงานนำเสนอที่น่าสนใจ:

ภาพสไลด์

ตรรกะที่สำคัญของเครื่องมือการผสานสามทางนั้นง่าย:

  • เปรียบเทียบไฟล์ฐานแหล่งที่มาและเป้าหมาย
  • ระบุ "chunks" ในไฟล์ต้นทางและไฟล์เป้าหมาย:
    • ชิ้นส่วนที่ไม่ตรงกับฐาน
    • ชิ้นส่วนที่เข้ากับฐาน
  • จากนั้นรวบรวมผลลัพธ์ที่ถูกผสานซึ่งประกอบด้วย:
    • ชิ้นที่จับคู่กันในทั้ง 3 ไฟล์
    • ชิ้นที่ไม่ตรงกับฐานในแหล่งที่มาหรือในเป้าหมาย แต่ไม่ทั้งคู่
    • ชิ้นที่ไม่ตรงกับฐาน แต่สามารถจับคู่กัน (กล่าวคือพวกมันถูกเปลี่ยนแบบเดียวกันทั้งในแหล่งที่มาและเป้าหมาย)
    • ตัวยึดสำหรับชิ้นส่วนที่ขัดแย้งที่จะได้รับการแก้ไขโดยผู้ใช้

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

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


"ไม่ว่าจะมีการเปลี่ยนแปลงความขัดแย้งหรือไม่" - ไม่ 2 ทางผสาน (diff) แสดงให้เห็นถึงความขัดแย้งไม่ได้เช่นกัน (แม้ว่าข้อมูลจะหายไปเป็นแหล่งที่มาของความขัดแย้ง) /
Vlad

1
อย่างไรก็ตามเป็นเรื่องธรรมดาใน Git ที่จะมีการผสาน 4 ทิศทางโดยที่ฐานไม่เหมือนกัน การผสาน 3 ทางยังดีกว่าและ 2 ทาง
Wernight

@Wightight มีการรวม 5 ทิศทางหรือไม่
Pacerier

@Pierier ไม่ว่าฉันจะรู้ แต่นั่นคือสิ่งที่เกิดขึ้นจริงในระหว่างการรับ - ส่งหรือรีบูต
Wernight

คำอธิบายโดยละเอียดและมีประโยชน์มาก
Kaneg

20

ฉันเขียนโพสต์โดยละเอียดเกี่ยวกับเรื่องนี้ โดยทั่วไปคุณไม่สามารถติดตามการลบ / เพิ่มด้วยสองทางมากไม่ได้ผลมาก


@pablo หากฉันเพิ่มฟังก์ชั่นก่อนหน้า X และคุณเพิ่มฟังก์ชั่นอื่นหลังจาก X และเราทำการรวมสามทางเครื่องมือจะใช้การเปลี่ยนแปลงทั้งสองโดยอัตโนมัติ แต่จะเกิดอะไรขึ้นเมื่อการเปลี่ยนแปลงของฉันขัดแย้งกับการเปลี่ยนแปลงของคุณ (เช่นเราแต่ละคนสร้างฟังก์ชันใหม่ด้วยชื่อฟังก์ชันเดียวกัน) วิธีการคือการควบรวมกิจการอัตโนมัติควรจะรู้ว่าบางของเรา "น่าเอือมระอาง่าย" ผสานสามารถจริงทำให้เกิดความขัดแย้ง ?
Pacerier

1
เพียงแค่อ่านบทช่วยสอนของคุณและมันมีประโยชน์กับฉันจริงๆ ฉันรู้สึกแบบเดียวกับนักพัฒนาที่คุณอธิบาย ฉันกลัวการรวมสามทางเสมอ
racl101

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

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

20

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

ตัวอย่างเช่นการมีสองการเปลี่ยนแปลงที่เพิ่มบรรทัดในตำแหน่งเดียวกันอาจถูก interpreded เป็นการเพิ่มสองส่วนไม่ใช่การเปลี่ยนแปลงหนึ่งบรรทัด

ตัวอย่างเช่น

ไฟล์ a ได้รับการแก้ไขโดยคนสองคนหนึ่งคนเพิ่มกวางมูสตัวหนึ่งและอีกตัวเพิ่มเม้าส์

#File a
    dog
    cat

#diff b, a
    dog
+++ mouse
    cat

#diff c, a
    dog
+++ moose
    cat

ตอนนี้ถ้าเรารวมการเปลี่ยนแปลงตามที่เรานำไปใช้เราจะได้รับ (การรวม 3 ทาง)

#diff b and c, a
    dog
+++ mouse
+++ moose
    cat

แต่ถ้าเราใช้ b แล้วดูการเปลี่ยนจาก b เป็น c มันจะดูเหมือนว่าเราเพิ่งเปลี่ยน 'u' เป็น 'o' (ผสานสองทาง)

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