ผลของการใช้กราฟต์ใน Mercurial


98

เมื่อเร็ว ๆ นี้มีคำถามมากมายเกี่ยวกับการข้ามการเปลี่ยนแปลงเมื่อรักษาสาขาเผยแพร่ใน Mercurial ตัวอย่างเช่น:

ตั้งแต่เปิดตัวใน 2.0 ฉันเคยสงสัยเกี่ยวกับการใช้graftเพื่อหลีกเลี่ยงปัญหานี้ ให้ต้นไม้แก้ไขดังนี้:

A---B---C---D---E---F---G---H---I---J

Eสมมติว่าเราจำเป็นต้องสร้างสาขาที่ปล่อยข้ามการเปลี่ยนแปลงชั่วร้าย

hg update -r D
hg graft "F::J"

ให้เรา:

A---B---C---D---E---F---G---H---I---J
             \
              --F'--G'--H'--I'--J'
  • Q1: เกิดอะไรขึ้นที่นี่? ฉันเข้าใจว่าtransplantจะมีการสร้างแพตช์จากF::Jนั้นจึงนำไปใช้Dแต่graftมีการกล่าวว่าจะใช้การผสาน 3 ทางแทนที่จะเป็นแพตช์ แล้ว ....... ทำงานอย่างไร? ทำไมถึงดีขึ้น?

ให้บอกว่าตอนนี้ฉันแก้ไขEและรวมเข้ากับสาขาการเผยแพร่ของฉัน

                  --E2-----------------
                 /                     \
A---B---C---D---E---F---G---H---I---J---M1
             \                            \
              --F'--G'--H'--I'--J'---------M2--

M1 เป็นการผสานแบบตรง ไม่มีอะไรพิเศษที่นั่น M2 กำลังรวมสาขาที่มีการเปลี่ยนแปลง "เหมือนกัน" (หรืออย่างน้อยเทียบเท่า)

  • Q2: คือการผสานนี้ก็ปกติ 3 วิธีการผสานการใช้D, J'และM1?
  • Q3: มีการจัดเก็บ / ใช้เมอร์คิวเรียลข้อมูลเพิ่มเติมเกี่ยวกับการต่อกิ่งเพื่อช่วยในการผสานหรือไม่

และในที่สุดก็...

  • Q4: อะไรคือปัญหาที่อาจเกิดขึ้นกับโฟลว์เช่นนี้?

คำตอบ:


119

เมื่อคุณอัปเดตDและต่อกิ่งF::JMercurial จะเรียกใช้การผสานจำนวนมาก จะเริ่มต้นด้วยการรวมนี้:

M = three_way_merge(local=D, other=F, base=E)

ถ้าเราเขียน+dสำหรับเดลต้าระหว่างรัฐCและDจากนั้นเราจะเริ่มต้นด้วย:

        +d     +e     +f
---- C ---- D ---- E ---- F ----

หมุนกราฟ 90 องศาตามเข็มนาฬิกาและการผสานสามทางด้านบนมีลักษณะดังนี้:

    -e  
  .---- D
 /
E
 \
  '---- F
    +f

นั่นก็คือเราแกล้งทำเป็นว่าเราเริ่มต้นด้วยEและนำไปใช้ตรงข้ามของที่จะได้รับ-e Dฉันคิดว่าเป็นแพทช์ย้อนกลับของ+e. เริ่มต้นในปีEนี้เรายังไปรัฐกับเดลต้าปกติF +fไม่มีอะไรที่แปลก ๆ ที่นี่ - เรามีทุกรัฐ ( D, EและF) ในพื้นที่เก็บข้อมูลที่มีอยู่แล้ว ดังนั้นเห็นเช่นนี้ก็เป็นที่ชัดเจนว่าเราสามารถผสานและDF

การรวมกันเป็นเรื่องของการ "จบเพชร" ดังนั้นเราจึงพบว่ารัฐใหม่Mที่เป็นส่วนผสมของDและFและสถานที่ที่แตกต่างจากDที่จะMมีความคล้ายคลึงกับ+fและความแตกต่างจากFที่จะมีความคล้ายคลึงกับM -eดูเหมือนว่า:

    -e     +f'
  .---- D ----.
 /             \
E               M
 \             /
  '---- F ----'
    +f     -e'

+fเดลต้ากลายเป็น+f'และเดลต้ากลายเป็น-e -e'นี่เป็นเพียงปกติสามทางผสาน แต่ผลที่ได้เป็นที่น่าสนใจ: เราได้นำมาใช้FบนDแทนE!

หลังจากการผสานพาเรนต์ที่สองของMto จะFถูกทิ้ง:

    -e     +f'
  .---- D ----.
 /             \
E               M
 \
  '---- F
    +f

ย้ำ: เราได้คัดลอก "ผล" ของFบนDนั่นคือเราได้พบเดลต้า ( +f') ที่นำไปใช้Dให้ผลเช่นเดียวกับเมื่อถูกนำไปใช้+f Eเราสามารถปรับกราฟให้ตรงได้เล็กน้อยเพื่อรับ:

       +f'
--- D ---- M
     \
      '---- E ---- F
        +e     +f

ผลที่ได้Fคือการต่อกิ่งDโดยใช้เครื่องจักรสามทางเต็มรูปแบบ

  • Q1:เกิดอะไรขึ้นที่นี่? แล้ว ....... ทำงานอย่างไร? ทำไมถึงดีขึ้น?

    A1:การใช้การผสานจะดีกว่าแพตช์เนื่องจากการผสานเครื่องจักรจะคำนึงถึงสิ่งต่างๆเช่นการเปลี่ยนชื่อ

  • Q2:การผสานนี้เป็นเพียงการผสาน 3 ทางปกติโดยใช้ D, J 'และ M1 หรือไม่

    A2:ใช่การต่อกิ่งไม่ได้เปลี่ยนโทโพโลยีของกราฟ

  • Q3: Mercurial เก็บ / ใช้ข้อมูลเพิ่มเติมเกี่ยวกับการต่อกิ่งเพื่อช่วยในการผสานหรือไม่?

    A3:ไม่

  • Q4:อะไรคือปัญหาที่อาจเกิดขึ้นกับโฟลว์เช่นนี้?

    A4:จากมุมมองของการผสานควรใช้งานได้ดี มันจะซ้ำประวัติศาสตร์บางอย่างซึ่งอาจทำให้ผู้คนสับสน


4
คำถามที่ดีคำตอบที่ดี :) +1 ทั้งคู่!
Laurens Holst

ขอบคุณมาร์ติน นั่นเป็นความคิดที่ค่อนข้างขี้ขลาดของใครก็ตามที่คิดขึ้นมา ฉันมีความคิด แต่จำเป็นต้องพิจารณากรณีทั่วไป ฉันเดาว่ามันมีไม่ว่าเส้นทางระหว่างโหนดที่คุณกำลังต่อกิ่งเข้า / ออก?
Paul S

3
@PaulS: ฉันคิดว่าสิ่งที่คุณต้องรู้ก็คือการปลูกถ่ายอวัยวะสามารถคัดลอกการเปลี่ยนแปลงรอบ ๆ ได้อย่างมีประสิทธิภาพมากกว่าการปลูกถ่าย แข็งแกร่งในแง่ที่การจัดการการเปลี่ยนชื่อและคุณสามารถแก้ไขข้อขัดแย้งในเครื่องมือผสาน รายละเอียดอยู่ในการผสานแปลก ๆ แต่หวังว่าจะไม่จำเป็นที่จะต้องเข้าใจสำหรับการใช้กราฟต์ในชีวิตประจำวัน! :-)
Martin Geisler

3
ไม่ แต่ฉันเป็นคนห่วยที่พยายามเข้าใจสิ่งที่ฉันไม่จำเป็นต้องทำ ;-) ฉันทำงานผ่านตัวอย่างทั่วไปโดยใช้ตัวอย่างของคุณเป็นฐานอยู่ดี
Paul S

@PaulS ถ้าเป็นเช่นนั้นฉันก็แทบจะกลัวที่จะพูดถึงสิ่งนี้กับคุณ ... แต่คุณสามารถค้นหาดาร์คและทฤษฎีการปะติดปะต่อของมันได้ เคล็ดลับข้างต้นเกี่ยวกับการหมุนกราฟ 90 องศาทำให้ฉันนึกถึงวิธีที่พวกเขาพูดถึงแพตช์การเดินทางเมื่อรวมเข้าด้วยกัน ของมีขนสวย ๆ :-)
Martin Geisler

6

Q1: ช่วยเมื่อมีความขัดแย้ง คุณสามารถใช้เครื่องมือผสานตามปกติของคุณได้แล้ว (สำหรับฉันมันคือเครื่องหมายความขัดแย้งแบบอินไลน์ซึ่งฉันแก้ไขด้วยโหมด smerge ของ Emacs)

Q2: เป็นการผสานปกติ

Q3: ไม่

Q4: ฉันคิดว่ามันน่าเกลียดที่มีสองสาขาที่เหมือนกันเกือบทั้งหมด

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