Git'te birleştirmek neden ve nasıl SVN'den daha iyi?


400

Birkaç yerde, dağıtılmış sürüm kontrol sistemlerinin parlamasının ana nedenlerinden birinin, SVN gibi geleneksel araçlardan çok daha iyi birleştiğini duydum. Bu aslında iki sistemin nasıl çalıştığı konusundaki doğal farklılıklardan mı yoksa Git / Mercurial gibi belirli DVCS uygulamalarında SVN'den daha akıllı birleştirme algoritmaları var mı?


Buradaki harika cevapları okuyarak hala tam bir cevap alamadım. Tekrar yayınlandı - stackoverflow.com/questions/6172037/…
ripper234


modelinize bağlıdır. daha basit durumlarda, svn genellikle daha iyidir çünkü yanlışlıkla tek yönlü bir geliştirme dalına basarsanız / birleştirir / çeker / basarsanız git gibi 3 yönlü birleştirme istemez. bkz: svnvsgit.com
Erik Aronesty

Yanıtlar:


556

Bir DVCS'de birleştirmenin neden Subversion'dan daha iyi olduğu iddiası büyük ölçüde Subversion'da bir süre önce dallanma ve birleştirmenin nasıl çalıştığına dayanıyordu. Öncesinde Subversion 1.5.0 Eğer birleştirilmiş gerekiyordu revizyonlar aralığı belirtmek zorunda birleştirme istediğinde böylece dalları birleştirildiğini zaman hakkında herhangi bir bilgi depolamak vermedi.

Peki Subversion birleşmeleri neden berbat oldu ?

Bu örneği düşünün:

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

B1'in değişikliklerini bagajda birleştirmek istediğimizde , bagajı teslim alınmış bir klasör üzerinde dururken aşağıdaki komutu veririz:

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

… Bu değişiklikleri b1yerel çalışma dizininizde birleştirmeye çalışacaktır . Ve sonra herhangi bir çakışmayı çözüp sonucu test ettikten sonra değişiklikleri taahhüt edersiniz. Düzeltme ağacı taahhüt ettiğinizde şöyle 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

Bununla birlikte, sürüm ağacı büyüdüğünde, revizyon aralıklarını belirtmenin bu yolu, alt sürümün ne zaman ve hangi revizyonların bir araya getirildiği hakkında meta verisi olmadığından hızla elden çıkar. Sonra ne olacağını düşünün:

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

Bu büyük ölçüde Subversion'un sahip olduğu havuz tasarımının bir sorunudur, bir şube oluşturmak için depoda bagajın bir kopyasını barındıracak yeni bir sanal dizin oluşturmanız gerekir, ancak ne zaman ve ne hakkında herhangi bir bilgi depolamaz. işler yeniden birleşti. Bu, zaman zaman kötü birleşme çatışmalarına yol açacaktır. Daha da kötüsü, Subversion'un varsayılan olarak iki yönlü birleştirme kullanmasıdır;

Bu Subversion'ı hafifletmek için artık şube ve birleştirme için meta veriler saklanıyor. Bu tüm problemleri çözecek değil mi?

Ve bu arada, Subversion hala berbat ...

Subversiyon gibi merkezi bir sistemde sanal dizinler emilir. Neden? Çünkü herkes onları görme hakkına sahiptir… deneysel çöpleri bile. Denemek istiyorsanız dallanma iyidir ama herkesin ve teyzelerinin denemesini görmek istemezsiniz . Bu ciddi bilişsel gürültüdür. Ne kadar çok dal eklerseniz o kadar çok saçmalık görürsünüz.

Bir depoda ne kadar çok kamu şubeniz varsa, tüm farklı şubeleri takip etmek o kadar zor olacaktır. Yani sorularınız, dalın hala gelişmekte olup olmadığı veya herhangi bir merkezi sürüm kontrol sisteminde söylemesi zor olan gerçekten ölü olup olmadığıdır.

Çoğu zaman, gördüğüm kadarıyla, bir organizasyon varsayılan olarak büyük bir şube kullanacaktır. Bu bir utanç çünkü test ve sürüm sürümlerini takip etmek zor olacak ve dallanmadan başka ne gelirse.

Peki Git, Mercurial ve Bazaar gibi DVCS neden dallanma ve birleşme sırasında Subversion'dan daha iyi?

Bunun çok basit bir nedeni var: dallanma birinci sınıf bir kavram . Orada hiçbir sanal dizinleri tasarım ve dalları tarafından basitçe depolarının senkronizasyonu (yani çalışmak için bu tür olması gerekir DVCS sert nesneler vardır itme ve çekme ).

Bir DVCS ile çalışırken yaptığınız ilk şey depoları (git clone, hg cloneve bzr branch) klonlamaktır . Klonlama, kavramsal olarak sürüm kontrolünde bir dal oluşturmakla aynı şeydir. Bazıları bu çatallama veya dallanma olarak adlandırılır (ikincisi genellikle birlikte konumlandırılmış dallara atıfta bulunmak için kullanılır), ancak aynı şeydir. Her kullanıcı kendi havuzunu çalıştırır, bu da kullanıcı başına dallanmaya devam ettiğiniz anlamına gelir .

Sürüm yapısı bir ağaç değil, bir grafiktir . Daha spesifik olarak yönlendirilmiş bir asiklik grafik (DAG, yani herhangi bir döngüsü olmayan bir grafik). Her bir taahhüdün bir veya daha fazla üst referansı (taahhüdün dayandığı temel) dışında bir DAG'ın özelliklerine odaklanmanız gerekmez. Bu nedenle, aşağıdaki grafikler revizyonlar arasındaki okları bu nedenle tersine gösterecektir.

Birleşmenin çok basit bir örneği bu olacaktır; denilen merkezi bir deponun originve deposu makinesine klonlayan bir kullanıcı olan Alice'i hayal edin .

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

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

Bir klon sırasında olan her revizyonun Alice'e olduğu gibi kopyalanması (benzersiz olarak tanımlanabilen hash-id'lerle doğrulanır) ve menşe dallarının nerede olduğunu işaretler.

Alice daha sonra kendi deposunda çalışarak repo üzerinde çalışır ve değişikliklerini zorlamaya karar verir:

         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 basittir, origindeponun yapması gereken tek şey tüm yeni revizyonları almak ve dalını en yeni revizyona (git "hızlı ileri" olarak adlandırır) taşımaktır:

         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 açıkladığım kullanım senaryosunun hiçbir şeyi birleştirmesi bile gerekmiyor . Üç yollu birleştirme algoritması, tüm sürüm kontrol sistemleri arasında hemen hemen aynı olduğundan, bu sorun gerçekten birleştirme algoritmalarıyla ilgili değildir. Mesele, her şeyden çok yapı ile ilgilidir .

Peki bana gerçek bir birleşimi olan bir örnek göstermeye ne dersin ?

Kuşkusuz yukarıdaki örnek çok basit bir kullanım örneğidir, bu yüzden daha yaygın olsa da çok daha bükülmüş bir şey yapalım. Bunun originüç revizyonla başladığını hatırlıyor musunuz? Onları yapan, ona Bob diyelim , kendi başına çalışıyor ve kendi deposunda bir taahhütte bulundu:

         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 değişikliklerini doğrudan origindepoya aktaramaz. Sistemin bunu nasıl algıladığı, Bob'un revizyonlarının doğrudan origin'' dan çıkıp çıkmadığını kontrol etmektir; Herhangi bir itme teşebbüsü sistemin " Ah ... korkarım Bob'u yapmana izin veremeyeceğini " söyleyen bir şeyle sonuçlanır .

(Git en Bob in-çekin ve sonra değişiklikleri birleştirmek zorundadır Yani pull; ya hg en pullve mergeya bzr en; merge). Bu iki aşamalı bir süreçtir. Önce Bob, origindepodan olduğu gibi kopyalayacak yeni düzeltmeleri getirmelidir . Şimdi grafiğin ayrıştığını görebiliyoruz:

                        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 işleminin ikinci adımı, sapma uçlarını birleştirmek ve sonucu taahhüt etmektir:

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

İnşallah birleşme çatışmalara girmez (eğer onları tahmin ederseniz iki adımı manuel olarak fetchve ile manuel olarak yapabilirsiniz merge). Daha sonra yapılması gereken, bu değişiklikleri tekrar zorlamaktır; bu origin, birleştirme taahhüdü origindepodaki en sonun doğrudan torunu olduğundan hızlı ileri bir birleşmeye neden olur :

                                 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'de rebase adı verilen ve Bob'un değişikliklerini en yeni değişikliklerden sonra değiştirecek başka bir seçenek var. Bu cevabın daha ayrıntılı olmasını istemediğim için bunun yerine git , mercurial veya çarşı belgelerini okumanıza izin vereceğim .

Okuyucu için bir alıştırma olarak, ilgili başka bir kullanıcıyla nasıl çalışacağını çizmeyi deneyin. Benzer şekilde Bob ile yukarıdaki örnek olarak yapılır. Depolar arasında birleştirmek düşündüğünüzden daha kolaydır çünkü tüm düzeltmeler / taahhütler benzersiz bir şekilde tanımlanabilir.

Her geliştirici arasında yama gönderme sorunu da var, bu Subversion'da git, hg ve bzr'de benzersiz bir şekilde tanımlanabilir revizyonlarla hafifletilen büyük bir sorundu. Birisi değişikliklerini birleştirdikten (yani birleştirme taahhüdü yaptığında) ve ekipteki herkesin merkezi bir depoya iterek veya yamalar göndererek göndermesi için gönderdikten sonra, birleştirme konusunda endişelenmek zorunda kalmazlar, çünkü zaten oldu . Martin Fowler bu şekilde karışık entegrasyon olarak adlandırıyor .

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


6
Şubelerinize katılmıyorum == gürültü argümanı. Çok sayıda şube insanları karıştırmaz, çünkü lider geliştirici insanlara hangi dalın büyük özellikler için kullanılacağını söylemelidir ... bu nedenle iki devs "uçan dinozorlar" eklemek için X dalında çalışabilir, 3 " araba insanlar "
Bay Boy

16
John: Evet, az sayıda dal için çok az gürültü var ve yönetilebilir. Ancak, çoğu aktif olup olmadıklarını söyleyemediğiniz yıkım veya net durumda 50'den fazla şubeye ve etikete ya da benzeri bir şeye tanık olduktan sonra geri gelin. Araçların kullanılabilirlik sorunu bir yana; neden tüm çöplerin deponuzda var? En azından p4'te (bir kullanıcının "çalışma alanı" aslında kullanıcı başına bir dal olduğundan), git veya hg, onları yukarı doğru itinceye kadar yaptığınız değişiklikleri herkesin bilmesine izin verme seçeneğiniz vardır; değişikliklerin başkaları ile alakalı olduğu durumlarda
Mart'ta Spoike

24
"Çok fazla deneysel dalınız da gürültü argümanı, @Spoike." Her kullanıcının kendi klasörü olduğu bir "Kullanıcılar" klasörünüz yok. Orada istediği sıklıkta dallayabilir. Şubeler Subversion'da ucuzdur ve diğer kullanıcıların klasörlerini görmezden gelirseniz (neden onları önemsemelisiniz), o zaman gürültü görmüyorsunuz.Ancak benim için SVN'de birleştirmek emmiyor (ve sık sık yapıyorum ve hayır, küçük değil Belki de yanlış bir şey yaparım;) Yine de Git ve Mercurial'ın birleşmesi üstündür ve güzel bir şekilde işaret ettiniz
John Smithers

11
SV'de aktif olmayan dalları öldürmek kolaydır, onları silersiniz. İnsanların kullanılmayan dalları kaldırmamaları, bu yüzden dağınıklık yaratması sadece bir temizlik meselesidir. Git'te de birçok geçici dalla kolayca kurtulabilirsiniz. İşyerimde standart olanlara ek olarak bir "geçici dallar" üst düzey dizini kullanıyoruz - "resmi" kod satırlarının tutulduğu dallar dizinini karmaşıklaştırmak yerine kişisel dallar ve deneysel dallar oraya giriyor (biz özellik dallarını kullanın).
Ken Liu

10
Bu demek oluyor ki, v1.5 yıkımından en azından git ile birlikte birleşebilir mi?
Sam

29

Tarihsel olarak Subversion, herhangi bir birleştirme bilgisi saklamadığı için yalnızca iki yönlü düz bir birleştirme gerçekleştirebilmiştir. Bu, bir dizi değişiklik almayı ve bunları bir ağaca uygulamayı içerir. Birleştirme bilgileriyle bile, bu hala en sık kullanılan birleştirme stratejisidir.

Git varsayılan olarak 3 yollu birleştirme algoritması kullanır; bu, birleştirilen kafalara ortak bir ata bulmak ve birleştirmenin her iki tarafında mevcut olan bilgileri kullanmaktır. Bu Git'in çatışmalardan kaçınmasında daha akıllı olmasını sağlar.

Git ayrıca, bazı yardımcı yeniden adlandırma bulma kodlarına da sahiptir. O değil changesets saklamak veya herhangi bir izleme bilgilerini saklamak - her işlemek ve disk depolama daha bundan daha karmaşıktır (gerektiği gibi kullandığı sezgisel yeniden adlandırır ve kod hareketlerini bulmak için de sadece dosyaların durumunu depolar, ancak arayüz mantık katmanına sunulur, hiçbir iz bırakmaz).


4
Svn'nin birleştirme çakışması olduğu ancak git'in olmadığı bir örneğiniz var mı?
Gqqnbig

17

Basitçe, birleştirme uygulaması daha iyi yapılır Git daha SVN . 1.5'ten önce SVN bir birleştirme eylemi kaydetmedi, bu nedenle SVN'nin kaydetmediği bilgileri sağlamak için gerekli olan kullanıcının yardımı olmadan gelecekteki birleştirmeleri yapmak mümkün değildi. 1.5 ile daha iyi oldu ve aslında SVN depolama modeli Git'in DAG'sinden biraz daha yetenekli. Ancak SVN, birleştirme bilgilerini, birleşmelerin Git'ten çok daha fazla zaman almasına izin veren oldukça kıvrımlı bir biçimde sakladı - Yürütme süresinde 300 faktörü gözlemledim.

Ayrıca SVN, taşınan dosyaların birleştirilmesine yardımcı olmak için yeniden adlandırma işlemlerini izlediğini iddia ediyor. Ancak aslında onları yine de bir kopya ve ayrı bir silme eylemi olarak saklar ve birleştirme algoritması değiştirme / yeniden adlandırma durumlarında, yani bir dalda bir dosyanın değiştirildiği ve diğer dalda yeniden adlandırıldığı durumlarda bunlara rastlar. birleştirilecek. Bu tür durumlar hala sahte birleştirme çakışmaları oluşturacak ve dizin yeniden adlandırmaları durumunda bile sessiz değişiklik kaybına yol açacaktır. (SVN halkı daha sonra değişikliklerin hala tarihte olduğuna dikkat çekiyor, ancak görünmeleri gereken birleştirme sonucunda olmadıklarında bu pek yardımcı olmuyor.

Öte yandan Git, yeniden adlandırma işlemlerini bile izlemez, ancak gerçeği (birleştirme zamanında) sonra çözer ve çok büyülü bir şekilde yapar.

SVN birleştirme temsilcisinin de sorunları vardır; 1.5 / 1.6'da gövdeden şubeye otomatik olarak istediğiniz sıklıkta birleşebilirsiniz, ancak diğer yönde bir birleştirmenin duyurulması gerekiyordu ( --reintegrate) ve şubeyi kullanılamaz bir durumda bıraktı. Daha sonra bunun aslında böyle olmadığını ve a) --reintegrate kutunun otomatik olarak çözülebildiğini ve b) her iki yönde tekrarlanan birleşmelerin mümkün olduğunu keşfettiler .

Ancak tüm bunlardan sonra (IMHO ne yaptıklarını anlama noktasını göstermiyor), SVN'yi önemsiz olmayan bir dallanma senaryosunda kullanmak için çok dikkatli olurdum ve ideal olarak Git'in ne düşündüğünü görmeye çalışırdım birleştirme sonucu.

SVN'deki şubelerin zorla küresel görünürlüğü olarak cevaplarda verilen diğer hususlar birleştirme yetenekleri ile ilgili değildir (ancak kullanılabilirlik için). Ayrıca, 'Git depoları SVN depoları (farklı bir şey) varken değişiyor'. Git kavramsal olarak her bir taahhüdü ayrı bir ağaç ( tar dosyası gibi) olarak saklar ve daha sonra bunu verimli bir şekilde saklamak için oldukça sezgisel yöntemler kullanır. İki işlem arasındaki değişikliklerin hesaplanması, depolama uygulamasından ayrıdır. Doğru olan Git'in geçmiş DAG'ı SVN'nin birleşmesini yaptığı çok daha basit bir biçimde saklamasıdır. İkincisini anlamaya çalışan herkes ne demek istediğimi bilecek.

Özetle: Git, revizyonları saklamak için SVN'den çok daha basit bir veri modeli kullanır ve bu nedenle = = pratik olarak daha iyi birleştirme ile başa çıkmak yerine gerçek birleştirme algoritmalarına çok fazla enerji koyabilir.


11

Diğer cevaplarda bahsedilmeyen ve DVCS'nin gerçekten büyük bir avantajı olan bir şey, değişikliklerinizi zorlamadan önce yerel olarak işlem yapabilmenizdir. SVN'de, kontrol etmek istediğim bir değişiklik olduğunda ve birisi bu arada aynı dalda zaten bir taahhütte bulunduysa, bu svn update, taahhütte bulunmadan önce bir şey yapmam gerektiği anlamına geliyordu . Bu, değişikliklerimin ve diğer kişiden gelen değişikliklerin artık birbirine karıştığı anlamına geliyor ve birleştirmeyi ( git resetveya gibi hg update -C) iptal etmenin bir yolu yok çünkü geri dönme taahhüdü yok. Birleştirme önemsizse, birleştirme sonucunu temizlemeden önce özellikleriniz üzerinde çalışmaya devam edemeyeceğiniz anlamına gelir.

Ama sonra, bu sadece ayrı dallar kullanmak için çok aptal olan insanlar için bir avantajdır (doğru hatırlarsam, SVN'yi kullandığım şirkette geliştirme için kullanılan sadece bir dalımız vardı).


10

DÜZENLEME: Bu öncelikle sorunun bu kısmını ele alıyor :
Bu aslında iki sistemin nasıl çalıştığındaki doğal farklılıklardan mı kaynaklanıyor yoksa Git / Mercurial gibi belirli DVCS uygulamalarında SVN'den daha akıllı birleştirme algoritmaları var mı?
TL; DR - Bu özel araçların algoritmaları daha iyidir. Dağıtılmanın bazı iş akışı avantajları vardır, ancak birleştirme avantajlarıyla dikeydir.
SON DÜZENLEME

Kabul edilen cevabı okudum. Sadece yanlış.

SVN birleşmesi bir ağrı olabilir ve aynı zamanda hantal da olabilir. Ancak, bir dakika boyunca nasıl çalıştığını görmezden gelin. Bu bilgi yok Git tutar veya SVN da tutmaz veya türetmek anlamına türetebilirsiniz. Daha da önemlisi, sürüm kontrol sisteminin ayrı (bazen kısmi) kopyalarının tutulmasının size daha gerçek bilgiler vermesinin bir nedeni yoktur. İki yapı tamamen eşdeğerdir.

"Zekice bir şeyler" yapmak istediğinizi varsayalım. Ve bir şey SVN'de kontrol ediliyor.

SVN'nizi eşdeğer Git formuna dönüştürün, Git'te yapın ve ardından sonucu birden fazla taahhüt kullanarak bazı ekstra dallarda kontrol edin. Bir SVN sorununu Git sorununa dönüştürmenin otomatik bir yolunu hayal edebiliyorsanız, Git'in temel bir avantajı yoktur.

Günün sonunda, herhangi bir sürüm kontrol sistemi bana izin verecek

1. Generate a set of objects at a given branch/revision.
2. Provide the difference between a parent child branch/revisions.

Ayrıca, birleştirmek için bilmek de yararlı (veya kritik)

3. The set of changes have been merged into a given branch/revision.

Mercurial , Git ve Subversion (şimdi yerel olarak, daha önce svnmerge.py kullanarak) üç bilginin tümünü sağlayabilir. DVC ile temelde daha iyi bir şey göstermek için, lütfen Git / Mercurial / DVC'de bulunan ve SVN / merkezi VC'de bulunmayan dördüncü bazı bilgilere dikkat edin.

Bu daha iyi araçlar olmadıkları anlamına gelmez!


1
Evet, soruyu başlıkta değil ayrıntılarda cevapladım. svn ve git aynı bilgilere erişebilir (aslında svn daha fazlasına sahiptir), bu yüzden svn git ne yaparsa onu yapabilir. Ancak, farklı tasarım kararları aldılar ve aslında öyle değil. DVC / centralized'in kanıtı git'i merkezi bir VC olarak çalıştırabilirsiniz (belki de bazı kurallar uygulanır) ve svn dağıtılmış çalıştırabilirsiniz (ancak tamamen berbat). Ancak, bu çoğu insan için çok akademik - git ve hg svn'den daha iyi dallanma ve birleştirme yapıyor. Bir araç seçerken gerçekten önemli olan budur :-).
Peter

5
Yukarı sürüm 1.5 kadar Subversion vermedi gerekli tüm bilgileri saklamak. 1.5 sonrası SVN ile Wven depolanan bilgiler farklıdır: Git bir birleştirme işleminin tüm ebeveynlerini depolarken Subversion, hangi revizyonların şubeye birleştirildiğini depolar.
Jakub Narębski

4
Bir svn deposunda yeniden uygulanması zor olan bir araçtır git merge-base. Git ile, "revizyon x'de bölünmüş dallar a ve b" diyebilirsiniz. Ancak svn depoları "dosyalar foo'dan bara kopyalandı", bu nedenle, bara kopyalamanın bir proje içindeki dosyaları kopyalamak yerine yeni bir dal oluşturduğunu anlamak için sezgisel tarama kullanmanız gerekir. Hile, svn'deki bir revizyonun revizyon numarası ve taban yolu ile tanımlanmasıdır . Çoğu zaman "gövde" varsaymak mümkün olsa da, aslında dallar varsa ısırır.
Douglas

2
Re: "Git'in svn'nin saklayamadığı veya türetemeyeceği türetebilecek hiçbir bilgi yoktur." - SVN'nin bir şeylerin ne zaman birleştirildiğini hatırlamadığını buldum. Eğer işi gövdeden dalınıza çekmek ve ileri geri gitmek isterseniz, birleşme zorlaşabilir. Git'te, revizyon grafiğindeki her düğüm, nereden geldiğini bilir. En fazla iki ebeveyn ve bazı yerel değişiklikler vardır. Git'in SVN'den daha fazlasını birleştirebileceğine güvenirim. SVN'de birleştirir ve dalı silerseniz, şube geçmişi kaybolur. GIT'de birleştirir ve dalı silerseniz, grafik kalır ve onunla birlikte "suçlama" eklentisi.
Richard Corfield

1
Bununla birlikte, svn'nin bilgiyi türetmek için hem yerel hem de merkezi verilere bakması gerekirken, git ve mercurial'ın yerel olarak gerekli tüm bilgilere sahip olması söz konusu değil mi?
Warren Dew

8

SVN, dosyaları içerik değişikliklerini izlerken izler . Bir sınıftan / dosyadan diğerine yeniden düzenlenmiş bir kod bloğunu izlemek için yeterince zekidir. Kaynağınızı izlemek için iki farklı yaklaşım kullanırlar.

Hala SVN kullanıyorum, ancak Git'i birkaç kez kullandığım için çok memnunum.

Vaktiniz varsa güzel bir okuma: Git'i neden seçtim


Ben de öyle okudum ve buna güveniyordum, ama pratikte işe yaramıyor.
Rolf

Git, dosyaların içeriğini izler, içeriği yalnızca değişiklik olarak gösterir
Ferrybig

6

Joel'in blogunda bir makale okuyun (ne yazık ki sonuncusu). Bu Mercurial hakkında, ama aslında Git gibi Dağıtılmış VC sistemlerinin avantajlarından bahsediyor.

Dağıtılmış sürüm kontrolü ile dağıtılan kısım aslında en ilginç kısım değildir. İlginç olan, bu sistemlerin versiyonlar açısından değil, değişiklikler açısından düşünmeleridir.

Makaleyi buradan okuyun .


5
Buraya göndermeden önce düşündüğüm makalelerden biriydi. Ama "değişiklikler açısından düşünüyor" çok belirsiz bir pazarlama-sonlu terimdir (Joel'in şirketinin DVCS'yi şimdi sattığını unutmayın)
Bay Boy

2
Bunun da belirsiz olduğunu düşündüm ... Değişikliklerin her zaman versiyonların (veya revizyonların) ayrılmaz bir parçası olduğunu düşündüm, bu da bazı programcıların değişiklikler açısından düşünmediğini şaşırtıyor.
Mart'ta Spoike

Gerçekten "değişiklikler açısından düşünen" bir sistem için Darcs
Max

@Max: elbette, ancak itme kıpırdamaya geldiğinde, Git Darcs'in aslında birleşme söz konusu olduğunda Subversion kadar acı verici olduğunu sunar.
tripleee

Git'in üç dezavantajı, a) belge yönetimi gibi ikili işler için o kadar iyi değildir, ki burada insanlar dallanmak ve birleştirmek istemez. klon şişkinliğine neden olan sık sık değişen ikili dosyalar için. Merkezi bir VCS'nin bu kullanım durumları için çok daha iyi olduğunu düşünüyorum. Git düzenli gelişim için özellikle birleştirme ve dallanma için çok daha iyi.
locka
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.