Mercurial'de greft kullanmanın sonuçları


98

Son zamanlarda Mercurial'de sürüm dallarını korurken değişiklikleri atlamakla ilgili birkaç soru var. Örneğin:

2.0'da tanıtıldığından beri, graftbu sorunu önlemek için kullanmayı merak ettim . Bunun gibi bir revizyon ağacı verildiğinde:

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

Kötülük değişikliğini atlayan bir yayın dalı oluşturmamız gerektiğini varsayalım E.

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

bize ver:

A---B---C---D---E---F---G---H---I---J
             \
              --F'--G'--H'--I'--J'
  • S1: Az önce burada ne oldu? Bunun transplantyamalar oluşturduğunu F::Jve sonra bunları uyguladığını anlayabiliyorum D, ancak graftyamalardan ziyade 3 yollu birleştirmeyi kullandığı söyleniyor. Peki ....... bu nasıl çalışıyor? Neden daha iyi?

Şimdi düzelttim Eve bunu sürüm şubemle birleştirdiğimi söyleyelim .

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

M1 düz bir birleştirmedir; orada özel bir şey yok. M2, üzerinde "aynı" (veya en azından eşdeğer) değişikliklerin olduğu dalları birleştirmektir.

  • S2: Bu birleştirme D, J've kullanan normal bir 3 yollu birleştirme M1mi?
  • S3: Mercurial, birleştirme işlemine yardımcı olmak için greft operasyonu hakkında ek bilgi depoladı / kullandı mı?

Ve sonunda...

  • S4: Böyle bir akışla ilgili olası sorunlar nelerdir?

Yanıtlar:


119

Güncelleme yaptığınızda Dve aşıladığınızda F::J, Mercurial bir dizi birleştirme gerçekleştirir. Bu birleştirme ile başlayacak:

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

Biz yazarsanız +ddevletler arasındaki delta için Cve Do zaman başlayalım:

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

Grafiği saat yönünde 90 derece çevirdiğinizde yukarıdaki üç yollu birleştirme şuna benzer:

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

Yani, ulaşmak için Etam tersi ile başladığımızı ve uyguladığımızı varsayıyoruz . Bunun ters yaması olarak düşünüyorum . Normal delta ile başlayarak da duruma geçtik . Burada garip bir şey yok - biz bütün devletleri (var , ve zaten depoda). Bu şekilde görüldüğünde, ve birleştirebileceğimiz açıktır .-eD+eEF+fDEFDF

Birleştirme, "elması tamamlama" meselesidir. Biz yeni bir devlet bulmak Yani Mbir karışımıdır Dve Fve yerden fark Detmek Mbenzerdir +fve farkı Fiçin Mbenzer -e. Şöyle görünüyor:

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

+fDelta oldu +f've -edelta haline geldi -e'. Bu sadece normal bir üç yollu birleştirme, ancak etkisi ilginç: Bunun yerine Füzerine uyguladık !DE

Birleştirme sonra ikinci ana Mkadar Fdüşürülür:

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

Yinelemek için: Biz "etkisi" kopyaladığınız Füzerine Dolduğunu, biz bir delta (bulduk +f'uygulanan) Dne zaman aynı etkiyi vermek +fuygulanmıştır E. Aşağıdakileri elde etmek için grafiği biraz düzeltebiliriz:

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

Sonuç, tam üç yollu makine kullanılarak Faşılanmasıdır D.

  • S1: Az önce burada ne oldu? Peki ....... bu nasıl çalışıyor? Neden daha iyi?

    A1: Birleştirme makinesi, yeniden adlandırma gibi şeyleri hesaba kattığından, birleştirme kullanmak yamalardan daha iyidir.

  • S2: Bu birleştirme, D, J 've M1 kullanan normal bir 3 yollu birleştirme mi?

    A2: Evet, aşılama grafiğin topolojisini değiştirmez.

  • S3: Mercurial, birleştirme işlemine yardımcı olmak için greft operasyonu hakkında ek bilgi depoladı / kullandı mı?

    A3: Hayır.

  • S4: Böyle bir akışla ilgili olası sorunlar nelerdir?

    A4: Birleştirme perspektifinden iyi çalışması gerekir. İnsanlar için kafa karıştırıcı olabilecek bazı tarihi kopyalar.


4
Harika soru, harika cevap :). İkisine de +1!
Laurens Holst

Teşekkürler Martin. Bunu her kim bulduysa bu oldukça garip bir düşünce. Fikrim var, ama genel durumu çözmem gerekiyor. Sanırım aşıladığınız düğümler arasındaki yol ne olursa olsun geçerli?
Paul S

3
@PaulS: Bence tek bilmen gereken, greftin etrafındaki değişiklikleri nakilden daha sağlam bir şekilde kopyalayabileceğidir. Yeniden adların işlenmesi ve çatışmaları bir birleştirme aracında çözebilmeniz açısından sağlam. Ayrıntılar, yaptığı tuhaf birleşmelerdedir, ancak umarım greftin günlük kullanımı için anlaşılması gerekli değildir! :-)
Martin Geisler

3
Hayır, ama ihtiyacım olmayan şeyleri anlamaya çalıştığım için aptalım ;-) Zaten seninkini temel olarak kullanarak daha genel bir örnek üzerinde çalıştım.
Paul S

@PaulS Öyleyse, bundan bahsetmekten neredeyse korkuyorum ... ama Darcs ve onun yama teorisine bakabilirsiniz . Yukarıdaki grafiği 90 derece döndürmekle ilgili hile, bana birleştirme sırasında yamaları değiştirmekten nasıl bahsettiklerini hatırlatıyor. Oldukça kıllı şeyler :-)
Martin Geisler

6

S1: Çatışma olduğunda yardımcı olur. O zaman her zamanki birleştirme aracınızı kullanabilirsiniz (benim için Emacs'in smerge modunda düzenlediğim satır içi çakışma işaretçileridir).

S2: Bu normal bir birleştirme.

S3: Hayır.

S4: Neredeyse aynı iki şubeye sahip olmanın çirkin olduğunu düşünüyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.