Git'te “dallanma ücretsiz” ne anlama geliyor?


27

Git'te "dallanma ücretsiz" ne anlama geliyor?

Git'in diğer sürüm kontrol sistemlerine kıyasla ne zaman söylendiğini çok duyuyorum.

Başkalarıyla ( SVN , vb.) İlgilenme fırsatım olmadı mı?

Yanıtlar:


28

"Dallanmanın serbesttir " iddiası gerçeklerin basitleştirilmesidir çünkü kendi başına "özgür" değildir. Kaputun altında bakıldığında daha doğru bir iddia dallanma olduğunu söylemek olurdu redonkulously ucuz çünkü yerine dalları temelde kaydedilmesini yapılan atıflar anlamına gelmektedir . Burada "ucuzluğu" daha ucuz ek yük olarak tanımlarım.

Ne tür bir ek yüke sahip olduğunu inceleyerek Git'in neden bu kadar ucuz olduğunu öğrenelim:

Şubeler gitde nasıl uygulanmaktadır?

Git deposu, .gitçoğunlukla git'in kullandığı meta verileri içeren dosyalara sahip dizinlerden oluşur. Git'te ne zaman şube oluşturursanız olun, örneğin git branch {name_of_branch}, birkaç şey olur:

  • Yerel şubeye şu adresten bir referans oluşturulur: .git/refs/heads/{name_of_branch}
  • Yerel şube için şu adreste bir geçmiş günlüğü oluşturulur: .git/logs/refs/heads/{name_of_branch}

Temel olarak bu, birkaç metin dosyası oluşturulur. Referansı bir metin dosyası olarak açarsanız, içerik şubenin işaret ettiği taahhüdün kimliği olacaktır. Dallara ayrılmanın başka tür bir nesne olduğu için herhangi bir taahhütte bulunmadığınızı unutmayın . Hem şubeler hem de taahhütler, gitmekte olan "birinci sınıf vatandaşlar" dır ve bunun bir yolu, şubeye bağlı ilişkiyi bir kompozisyondan ziyade bir toplama olarak düşünmektir. Bir dalı kaldırırsanız, komisyonlar hala "sarkan" olarak var olur. Yanlışlıkla bir şubeyi kaldırırsanız, her zaman taahhüdü bulmayı deneyebilir git-lost-foundveya git-fsck --lost-foundbıraktığınız sha-id'de bir dal oluşturmaya çalışabilirsiniz (ve git henüz herhangi bir çöp toplama işlemi yapmadığı sürece).

Peki Git, üzerinde çalıştığınız şubeyi nasıl takip ediyor? Cevap, dalda .git/HEADiseniz, bu gibi görünen dosya ile master.

ref: refs/heads/master

Dalları değiştirmek, .git/HEADdosyadaki başvuruyu değiştirir ve ardından çalışma alanınızın içeriğini taahhütte tanımlananlarla değiştirir.

Bu diğer sürüm kontrol sistemlerinde nasıl karşılaştırılır?

In Subversion , dallar depoda sanal dizinleri vardır . Dolayısıyla, dallandırmanın en kolay yolu, tek bir astar ile uzaktan yapmaktır svn copy {trunk-url} {branch-url} -m "Branched it!". SVN ne yapacak:

  • Kaynak dizini, örneğin trunkbir hedef dizine kopyalamak ,
  • Kopyalama işlemini sonlandırmak için değişiklikleri yapın.

Bu işlemi sunucuda uzaktan yapmak isteyeceksiniz, çünkü bu kopyayı yerel olarak yapmak, dosyaların kopyalanması ve birbirine bağlanması ile doğrusal bir işlemdir. Bu çok yavaş bir işlemdir, oysa sunucuda yapmak sürekli bir işlemdir. Dal, dal üzerinde gerçekleştirilirken bile, subversion , dallanma sırasında git yaparken bir kilitlenme gerektirdiğini ve bunun önemli bir fark olduğunu unutmayın. Bu, SVN'yi Git'ten daha az ucuz yapan bir tür ek yük.

Dalları SVN'de değiştirmek , yani svn switchgerçekten svn updatekılık değiştiren komut . Sanal dizin konsepti sayesinde komut svn'de git komutundan biraz daha esnektir. Çalışma alanınızdaki alt dizinler, başka bir depo URL'sini yansıtmak için değiştirilebilir. En yakın şey kullanmak olacaktır, git-submoduleancak bunu kullanmak dallanmadan anlamsal olarak farklıdır. Ne yazık ki, bu aynı zamanda SVN'de geçişi Git'tekinden biraz daha yavaş değiştiren bir tasarım kararıdır, çünkü uzak çalışma alanını yansıtmakta olan her bir çalışma alanı dizinini kontrol etmek zorundadır. Tecrübelerime göre, Git şubelerini değiştirmek SVN'den daha hızlı.

SVN'nin dallanması, dosyaları kopyaladığı ve her zaman halka açık hale getirilmesi gereken bir maliyete sahiptir. Git'te yukarıda açıklandığı gibi, şubeler "sadece referanslar" dır ve yerel deponuzda tutulabilir ve kendi takdirinize göre yayınlanabilir. Ancak benim deneyimime göre SVN hala ClearCase'den çok daha ucuz ve daha performanslı.

Bu sadece SVN'nin merkezden uzaklaştırılmadığı bir serseri. Bazı kaynak deposuna yansıtılmış olarak birden fazla havuza sahip olabilirsiniz, ancak farklı değişiklikleri senkronize etmek için birden fazla SVN deposu mümkün değildir, çünkü SVN, taahhütler için benzersiz tanımlayıcılara sahip değildir (git işlemin içeriğine dayanan tanımlayıcılara sahiptir). Git'i SVN üzerinden kişisel olarak kullanmaya başlamamın nedeni, bir depo başlatmanın git için oldukça kolay ve ucuz olması . Kavramsal olarak yazılım konfigürasyon yönetimi açısından, bir projenin her bir farklı kopyası (klon, çatal, çalışma alanı veya her neyse) bir "dal" dır ve bu terminolojiye SVN'de yeni bir kopya oluşturarak verilen sonuncunun sahip olduğu Git kadar ucuz değildir "yerleşik" dalları.

Başka bir örnek olarak, Mercurial'da , dallanma DVCS'den biraz farklı bir şekilde başladı ve adlandırılmış dallar yaratma / yok etme işlemi için ayrı ayrı taahhütler gerekiyor. Mercurial geliştiriciler geliştirme sonraki bölümlerinde uygulanan imleri olsa mimik seyahatseverlerin Git en aynı dallanma modeline headsdenir tipsve branchesolan bookmarkscıva terminolojisinde yerine.


Vay. "Pahalı" açıklama için çok teşekkürler.
laggingreflex

2
Kendi kaynağınızdan: This command causes a near-instantaneous commit in the repository, creating a new directory in revision 341. The new directory is a copy of /calc/trunk.- Şube oluşturma, her dosyanın açıkça kopyasını almadığınız sürece SVN'de önemsizdir.
Bobson,

@Bobson Dalları yeniden yazma hakkında düşünüyordum, çünkü bununla ilgili çok fazla el dalgası yapıyorum, ama benim açımdan Git'te değilken bir dal oluşturmak için bir taahhüdün gerekli olduğu hala duruyor . Alçakgönüllülük tecrübemle, SVN'deki şubeleri değiştirmenin Git'tekinden daha yavaş olmasına rağmen hala bunun nedenini belirleyemiyorum.
Spoike

2
@Spoike - Anahtarlama, kesinlikle. Ve kesinlikle bir taahhüt gereklidir. Bir problemim olduğunu biraz açıklığa kavuşturmak için bir düzenleme yaptım. İsterseniz geri almaktan çekinmeyin.
Bobson,


10

Git'te bir dal, sadece yerel repo taahhüdüne referansta bulunur. Oluşturmak çok ucuz, hiç ağ yok. Tamamen ücretsiz değil (bir komut yazmanız gerekir) ama çok yakınsınız.

Dallanma SVN'de özellikle pahalı değildir - bu sadece çok ucuz bir işlem olan bir kopyadır. SVN'nin merkezi bir depo modeli var, bu yüzden bir ağ erişimi, ancak korkunç değil.

Öte yandan saygıdeğer CVS'de dallanma ÇOK pahalıdır. Temel olarak, CVS dalları bir etiket eklemeyi içerir, ancak CVS'de, HER FILE AFFECTED'in değiştirilmesi gerektiği anlamına gelir. Her dosya yeni etiketi içerecek şekilde yeniden yazılmıştır. Bu çok pahalı. Ve eğer deponuz büyükse, aynı zamanda korkunç derecede yavaş. Aslında, eğer büyük bir projedeyseniz, bazı kişilerin yapabiliyorsa şube yapmaktan kaçınma eğilimi göstermesi yeterince yavaş.


4
Git ile bu bir taahhütten daha az şeydir - dal sadece bir etikettir. Ve SVN, her ikisi de tüm dosyaları kopyaladığından CVS kadar pahalıdır.
Izkata

8
@ İzkata: Kullanıcı açısından görürsek - evet, tüm dosyalar kopyalanır, uygulama (ve performans) bakış açısından - hayır, sadece kopya ile ilgili bir kayıt eklenir.
maxim1000

@ İzkata yorum yapmak için çok fazla - cevabımı gör.
gbjbaanb

6
@Izkata SVN, işaretçiler ve referanslar oluşturur, her şeyi kopyalamaz.
Aaron McIver

2
Bir Git şubesi bir taahhüt değildir , sadece serbestçe diğer komisyonlara taşınabilecek bir taahhüdün referansıdır. Bir Git deposunu yalnızca bir taahhüt ağacı olarak düşünün ve bu ağaç üzerindeki farklı taahhütlere serbestçe taşınabilecek yapışkan notlar olarak dallar.
40XUserNotFound

5

SVN'nin dallanması, Git'inki kadar ücretsizdir. Bu sadece şubenin nerede başladığı, saklanan dosyalarda hiçbir değişiklik yapmadığını söyleyen temizlik verileridir. SVN'deki bir 'kopya', bir Unix dizinine sembolik bağlantı eklemek gibidir. SVN şubesinin, çalışma kopyası değişikliklerinizi gerçekleştirene kadar bir ağ gezisi gerektirmeyeceğini unutmayın (ancak, bir noktada yerel olarak işlem yapmazsanız bir SCM'ye sahip olmanızın fazla bir anlamı yoktur).

Bir Git şubesinin aynı zamanda bazı temizlik hizmetleri içereceğini - bu etiketi dahili olarak eklemek gibi - taahhüt ettiğinizde bir yere kaydedilmesi gerektiğini unutmayın. Hiç önemli değil, bu yüzden “özgür” olarak adlandırılıyor.


5

'Ücretsiz' (bu bağlamda 'ücretsiz' gerçekten hızlı ve kolay ve yer kaplamayan anlamına gelir) çünkü bazı eski sürüm kontrol sistemlerinde bir dal bu noktada kodun tam bir kopyasıydı, bu nedenle dallar çok fazla yer kapladı. Alan ve yazılımın tamamen farklı sürümleriyle dolu, sonra da yönetimi ele geçiren bir programla son derece kolaydı. Diğerlerinde, kodun tam bir kopyası değildi, ancak bir etiket için hala değiştirilmesi gereken her dosya yavaş ve acı vericiydi ('pahalı').

git'in dalları esasen bir taahhüdü işaret eden etiketlerdir ve bu nedenle yukarıdaki sorunlardan kaçınırlar.


1

"Ücretsiz / ucuz / pahalı" nın bir başka yönü, dallanmanın aşağı yönlü sonuçları ile başa çıkmak için geliştirici kaynakları açısından maliyetlerin ne kadar olması gerektiğidir; birleşme süreci şubelerden değişmektedir.

Ve burada, Git ve Mercurial gibi DVCS sistemlerinde şubeleri birleştirmek, eski sistemlerden daha kolaydır ... çünkü DVCS sistemleri grafikteki sürümlerin geçmişini izlemek için çok daha iyi bir iş çıkarır; yani önceki dallanma bir birleşme gerçekleştiğinde. Bu, birleşmeleri daha doğru hale getirir, gereksiz çatışmaları azaltır ve ... dahil olan geliştiriciler için öznel olarak "daha kolay" veya "daha az korkutucu" birleşmeyi sağlar.

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.