SORU
18 Mart 2010, PERŞEMBE


Nasıl ve/veya neden Git daha iyi SVN göre birleştirme?

Ana yollarından biri, sürüm kontrol sistemleri, çok SVN gibi geleneksel araçlardan daha iyi birleştirme dağıtılmış parlayan bir kaç yerde duymuştum. Bu aslında iki sistemin nasıl çalıştığını doğasında farklılıklar nedeniyle, ya da yapmaközelGit/Mercurial gibi DVCS uygulamaları sadece zeki SVN den algoritmaları birleştirme var mı?

CEVAP
18 Mart 2010, PERŞEMBE


Birleştirme Subversion daha bir DVCS daha iyi olduğunu neden iddia büyük ölçüde dallanma ve birleştirme Subversion bir süre önce nasıl çalıştığını dayanıyordu. Subversion 1.5.0 önce dalları birleştirilmiş olduğunu hakkında herhangi bir bilgi deposu yoktu, böylece birleştirmek istediğinde, birleştirilmiş olmalıydı belirtmeniz gerekiyordu.

Neden Subversion birleştirmesi yaptımberbat?

Bu örnek düşünün:

      1   2   4     6     8
trunk o-->o-->o---->o---->o
       \
        \   3     5     7
b1        ->o---->o---->o

Gövde içine merge b1 değişiklikleri için bagaj teslim olan bir klasör üzerinde ayakta iken aşağıdaki komutu ederiz:

svn merge -r 3:7 {link to branch b1}

... yerel çalışma dizinini içine b1 gelen değişiklikleri birleştirmek için çalışacaktır. Ve sonra herhangi bir çatışma çözmek ve sonucu test ettikten sonra değişiklikleri kaydetme. Tamamlama revizyon ağacı bu gibi görünecektir:

      1   2   4     6     8   9
trunk o-->o-->o---->o---->o-->o      "the merge commit is at r9"
       \
        \   3     5     7
b1        ->o---->o---->o

Ancak revizyon aralıklarını belirterek, bu şekilde ağaç olarak büyür subversion sürüm düzeltmeleri birleştirilmiş olarak ne zaman ve herhangi bir meta veri yoktu hızla kontrolden çıkıyor. Daha sonra ne olacağını düşünmek:

           12        14
trunk  …-->o-------->o
                                     "Okay, so when did we merge last time?"
              13        15
b1     …----->o-------->o

Bu yeni bir oluşturmak için ihtiyacınız olan bir şube yaratmak amacıyla büyük ölçüde Tahrip olan depo tasarımı ile ilgili bir sorunsanal dizinbagajdan bir kopyasını ev sahipliği yapacak ama ne zaman ile ilgili herhangi bir bilgi deposu değildir ve ne deposunda şeyler birleştirilmiş döndü. Kötü yol zaman zaman çatışmalar birleştirmek. Hatta daha da kötüsü Subversion otomatik olarak bazı sınırlamalar sarsılan iki şube başkanları ortak atalarına göre değil birleştirme olan iki yönlü varsayılan olarak birleştirme kullanılır.

Bu baskılar azaltmak için artık şube için depolar meta veri ve birleştirme. Tüm sorunları çözecek mi?

Ve oh, bu arada, Subversion hala berbat...

Merkezi bir sistem, subversion gibisanal dizinlerberbat. Neden? Herkes onları görme hakkı... hatta çöp deneysel olanlar var çünkü. Dallanma eğer deneme yapmak istersen iyi olurama herkesin kendi deney teyzeler . görmek istemezsin . Bu ciddi bilişsel gürültü. Daha dallar ekleyin, daha bok görürsün.

Sert tüm farklı dalları takip edilecek bir havuz var kamu dalları. Olacak soru varsa şube hala gelişme olursa ya da eğer gerçekten öldü ise herhangi bir merkezi sürüm kontrol sistemi olarak söylemek zor.

Çoğu zaman, gördüğüm kadarıyla, bir kuruluşun varsayılan büyük bir şube zaten kullanmak için. Bu sırayla Test ve sürüm Sürüm takip etmek zor olacak çünkü, ve başka iyi dallanma kaynaklanıyor ne yazık ki.

Neden DVCS, Git, Mercurial ve Çarşı, dallanma ve birleştirme de Subversion daha iyi gibi?

Neden çok basit bir nedeni var:dallanma birinci sınıf bir kavramdır. Vardırsanal dizintasarım ve şubeleri tarafından sadece depoların eşitleme (örn . çalışmak için böyle olması gerekiyor hangi DVCS sert cisimlerin ^em>itinveçekin).

Bir DVCS ile çalışma sırasında yapılacak ilk iş depoları clone, hg clone hadi git branch en kolayıdır. Bazaar ' () klon için. Klonlama aynı şeyi sürümü kontrol şube oluşturma gibi kavramsal olarak. Bu çağrıçatallaşmayadallanmaikincisi genelde başvurmak için kullanılır, ancak (co-bulunan şubeleri) ama ikisi de aynı şey. Her bir kullanıcı var demektir kendi depo çalışırkullanıcı başına dallanmaoluyor.

Sürüm yapıdırağaç değildeğilgrafikyerine. directed acyclic graph bir daha özel (herhangi bir döngüsü olmayan bir grafik anlam DAG). Gerçekten bir DAG işlemek bir veya daha üst başvuruları taahhüt ne bağlı olarak) her dışındaki ayrıntılar üzerinde durmaya gerek yok. Aşağıdaki grafikler tersine bu düzenlemeler arasında okları gösterecektir.

Olur bu, merkezi bir depo hayal birleştirilmesi çok basit bir örnek origin ve bir kullanıcı, Alice, onu makineye depo klonlama denir.

         a…   b…   c…
origin   o<---o<---o
                   ^master
         |
         | clone
         v

         a…   b…   c…
alice    o<---o<---o
                   ^master
                   ^origin/master

Ne olur sırasında bir klonu olan her revizyon kopyalanır Alice tam olarak ediyorlardı (doğrulanmış tarafından tespit edilebileceğini karma-ıd), ve işaretleri nerede kaynaktır dallarıdır.

Alice sonra ona repo, kendi Depo ve karar değişiklikleri itmek için yapılıyor çalışır:

         a…   b…   c…
origin   o<---o<---o
                   ^ master

              "what'll happen after a push?"


         a…   b…   c…   d…   e…
alice    o<---o<---o<---o<---o
                             ^master
                   ^origin/master

Çözüm oldukça basit, tek şey bu origin depo ihtiyaçlarını yapmak için tüm yeni düzeltmeleri ve hareket şube için en yeni sürüm (gıt aramalar "ileri"):

         a…   b…   c…   d…   e…
origin   o<---o<---o<---o<---o
                             ^ master

         a…   b…   c…   d…   e…
alice    o<---o<---o<---o<---o
                             ^master
                             ^origin/master

Yukarıda resimli, kullanma durumu,,hiç bir şeyi birleştirmek gerekir. Konu üç yollu birleştirme beri birleştirme algoritmaları ile değil algoritma hemen hemen tüm sürüm kontrol sistemleri arasında aynıdır.Sorun her şeyden daha çok ilgili yapıdır.

Peki bana bir örnek gösteringerçekbirleştirme?

Yukarıdaki örnekte kuşkusuz bu çok basit bir senaryo, hadi daha yaygın bir şekilde de olsa, çok daha sapkın biri yok. origin üç revizyonları ile başladı hatırlıyor musun? Peki, bunları yapan adam, onun adını verelimBobkendi başına çalışıyor ve yaptı kendi depo tamamlama:

         a…   b…   c…   f…
bob      o<---o<---o<---o
                        ^ master
                   ^ origin/master

                   "can Bob push his changes?" 

         a…   b…   c…   d…   e…
origin   o<---o<---o<---o<---o
                             ^ master

Şimdi Bob doğrudan origin depoyu yaptığı değişiklikleri itin. Sistem nasıl bu Bob revizyonlar doğrudan origin'bu durumda s, yok. inişlerde olmadığını kontrol ederek tespit İtmek için herhangi bir girişimde sisteme bir şey"*. *46" benzer diyerek neden olur

Bob çekin ve sonra değişiklikleri gıt pull; veya hg pull ve merge; ya da en kolayıdır. Bazaar ' merge () birleştirme. Bu iki adımlı bir işlemdir. İlk Bob origin deposundan onları olduğu gibi kopya olacak olan yeni düzenlemeler, alması gerekir. Şimdi grafik uzanıyor görebilirsiniz:

                        v master
         a…   b…   c…   f…
bob      o<---o<---o<---o
                   ^
                   |    d…   e…
                    ----o<---o
                             ^ origin/master

         a…   b…   c…   d…   e…
origin   o<---o<---o<---o<---o
                             ^ master

Çekme sürecinin ikinci aşamasında farklı ipuçları birleştirmek ve bir sonuç tamamlama yapmak için:

                                 v master
         a…   b…   c…   f…       1…
bob      o<---o<---o<---o<-------o
                   ^             |
                   |    d…   e…  |
                    ----o<---o<-- 
                             ^ origin/master

Umarım ihtilafları (eğer onları bekliyorsanız iki adımları fetch merge ile git içinde el ile yapabilirsiniz) içine çalışmaz birleştirme. Daha sonra yapılması gerektiğini söyledi. push değişiklikleri tekrar origin hangi nedenle içine bir ileri birleştirme beri birleştirmeyi tamamlama bir doğrudan soyundan son olarak origin depo:

                                 v origin/master
                                 v master
         a…   b…   c…   f…       1…
bob      o<---o<---o<---o<-------o
                   ^             |
                   |    d…   e…  |
                    ----o<---o<-- 

                                 v master
         a…   b…   c…   f…       1…
origin   o<---o<---o<---o<-------o
                   ^             |
                   |    d…   e…  |
                    ----o<---o<-- 

Git ve hg adlı birleştirmek için başka bir seçenek yokturrebasesonra yeni değişikliklere Bob değişiklikleri hareket edeceğiz., Bu cevap seni okuturum daha ayrıntılı olmak istemiyorum beri git, mercurial bazaar bu konuda yerine docs.

Okuyucu için bir alıştırma olarak, başka bir kullanıcı ile ilgili işe yarar nasıl çizim deneyin. Aynı şekilde Bob ile yukarıda örnek olarak yapılır. Depoları tüm düzeltmeleri/tamamlar çünkü ne düşüneceğini daha kolay arasında birleşen benzersiz olarak tanımlanabilir.

Aynı zamanda git, hg hafifletilmiş ve benzersiz olarak tanımlanabilir revizyonların en kolayıdır. Bazaar ' olan Subversion büyük bir sorun olduğunu her geliştirici, arasında parçaları göndermek sorunu vardır. Bir zamanlar birileri vardır birleştirilmiş yaptığı değişiklikler (yani bir birleştirme tamamlama) gönderir ve bunun için herkesin takıma tüketmek ya da itmek için bir merkezi depo veya parçaları göndermek sonra endişeye mahal yok ile ilgili birleştirme, çünkü çoktan oldu. Martin Fowler bu çalışma yöntemini promiscuous integration çağırır.

Yapı Subversion farklı, yerine bir DAG kullanılarak olduğundan, dallanma ve sadece kullanıcı için sistem için değil de daha kolay bir şekilde yapılması için birleştirme sağlar.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bunliu

    bunliu

    2 Mayıs 2007
  • Lin Steven

    Lin Steven

    17 EKİM 2006
  • ModNation Racers H.Q.

    ModNation Ra

    31 Ocak 2010