Konsekuensi menggunakan graft di Mercurial

98

Ada beberapa pertanyaan baru-baru ini tentang melewatkan perubahan saat mempertahankan cabang rilis di Mercurial. Sebagai contoh:

Sejak diperkenalkan pada 2.0, saya bertanya-tanya tentang penggunaan graftuntuk menghindari masalah ini. Diberikan pohon revisi seperti ini:

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

Misalkan kita perlu membuat cabang rilis yang melewatkan perubahan Evil E.

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

memberi kami:

A---B---C---D---E---F---G---H---I---J
             \
              --F'--G'--H'--I'--J'
  • Q1: Apa yang baru saja terjadi di sini? Saya dapat memahami bahwa transplantakan menghasilkan tambalan dari F::J, dan kemudian menerapkannya D, tetapi graftdikatakan menggunakan penggabungan 3 arah daripada tambalan. Jadi ....... bagaimana cara kerjanya? Mengapa lebih baik?

Katakanlah saya sekarang memperbaiki E, dan menggabungkannya ke cabang rilis saya.

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

M1 adalah gabungan lurus; tidak ada yang istimewa di sana. M2 menggabungkan cabang yang memiliki perubahan "yang sama" (atau setidaknya setara).

  • T2: Apakah penggabungan ini hanya penggabungan 3 arah biasa menggunakan D, J'dan M1?
  • T3: Apakah mercurial telah menyimpan / menggunakan informasi tambahan tentang operasi cangkok untuk membantunya melakukan penggabungan?

Dan akhirnya...

  • T4: Apa masalah potensial dengan aliran seperti ini?
Paul S
sumber

Jawaban:

119

Saat Anda memperbarui ke Ddan mencangkok F::J, Mercurial menjalankan sejumlah penggabungan. Ini akan dimulai dengan penggabungan ini:

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

Jika kita menulis +duntuk delta antara state Cdan D, maka kita mulai dengan:

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

Putar grafik 90 derajat searah jarum jam dan penggabungan tiga arah di atas terlihat seperti ini:

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

Artinya, kita berpura-pura bahwa kita mulai dengan Edan menerapkan kebalikan dari -eto get to D. Saya menganggapnya sebagai tambalan kebalikan dari +e. Dimulai Ekami juga pergi ke negara bagian Fdengan delta normal +f. Tidak ada yang aneh di sini - kami memiliki semua negara ( D, E, dan F) dalam repositori sudah. Jadi terlihat seperti ini, jelas kita bisa menggabungkan Ddan F.

Penggabungan adalah masalah "menyelesaikan berlian". Jadi kami menemukan keadaan baru Myang merupakan campuran dari Ddan Fdan di mana perbedaan dari Dmenjadi Mmirip +fdan perbedaan dari Fke Mmirip dengan -e. Ini terlihat seperti ini:

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

The +fdelta menjadi +f'dan -edelta menjadi -e'. Ini hanya normal tiga-cara merge, tetapi efeknya menarik: kami telah diterapkan Fke Dbukan E!

Setelah penggabungan, orang tua kedua Muntuk Fdihapus:

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

Untuk mengulangi: Kami telah menyalin "efek" dari Fke D, yaitu, kami telah menemukan sebuah delta ( +f') yang diterapkan untuk Dmemberikan efek yang sama seperti ketika +fditerapkan ke E. Kita bisa sedikit meluruskan grafik untuk mendapatkan:

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

Hasilnya adalah Fdicangkokkan Dmenggunakan mesin tiga arah penuh.

  • Q1: Apa yang baru saja terjadi di sini? Jadi ....... bagaimana cara kerjanya? Mengapa lebih baik?

    A1: Menggunakan penggabungan lebih baik daripada tambalan karena mesin penggabungan mempertimbangkan hal-hal seperti mengganti nama.

  • T2: Apakah penggabungan ini hanya penggabungan 3 arah biasa menggunakan D, J 'dan M1?

    A2: Ya, pencangkokan tidak mengubah topologi grafik.

  • T3: Apakah mercurial telah menyimpan / menggunakan informasi tambahan tentang operasi cangkok untuk membantunya melakukan penggabungan?

    A3: Tidak.

  • Q4: Apa potensi masalah dengan aliran seperti ini?

    A4: Dari perspektif penggabungan, seharusnya berfungsi dengan baik. Ini akan menduplikasi beberapa sejarah yang mungkin membingungkan orang.

Martin Geisler
sumber
4
Pertanyaan bagus, jawaban bagus :). +1 untuk keduanya!
Laurens Holst
Terima kasih Martin. Itu adalah pemikiran yang cukup funky oleh siapapun yang muncul dengan itu. Aku punya idenya, tapi perlu menyelesaikan kasus umumnya. Saya menduga itu berlaku tidak peduli jalur antara node tempat Anda mencangkok ke / dari?
Paul S
3
@PaulS: Saya pikir semua yang perlu Anda ketahui adalah bahwa graft dapat menyalin kumpulan perubahan dengan cara yang lebih kuat daripada transplantasi. Kuat dalam arti bahwa penggantian nama ditangani dan Anda bisa menyelesaikan konflik di alat gabungan. Detailnya ada dalam penggabungan aneh yang dilakukannya, tapi semoga itu tidak penting untuk dipahami untuk penggunaan cangkok sehari-hari! :-)
Martin Geisler
3
Tidak, tapi saya payah karena mencoba memahami hal-hal yang tidak saya perlukan ;-) Saya bekerja melalui contoh yang lebih umum dengan menggunakan yang Anda sebagai basis.
Paul S
@PaulS Jika demikian, maka saya hampir takut untuk menyebutkan ini kepada Anda ... tetapi Anda dapat mencari Darcs dan teori tambalannya. Trik di atas tentang memutar grafik 90 derajat mengingatkan saya pada bagaimana mereka berbicara tentang tambalan komuter saat menggabungkan. Barang-barang yang sangat berbulu :-)
Martin Geisler
6

Q1: Ini membantu ketika ada konflik. Anda dapat menggunakan alat gabungan biasa (bagi saya ini adalah penanda konflik sebaris, yang saya edit dengan mode smerge Emacs).

T2: Ini penggabungan normal.

Q3: Tidak.

T4: Menurut saya jelek memiliki dua cabang yang hampir identik.

Dering
sumber