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.
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.
Yanıtlar:
"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:
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:
.git/refs/heads/{name_of_branch}
.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-found
veya git-fsck --lost-found
bı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/HEAD
iseniz, bu gibi görünen dosya ile master
.
ref: refs/heads/master
Dalları değiştirmek, .git/HEAD
dosyadaki başvuruyu değiştirir ve ardından çalışma alanınızın içeriğini taahhütte tanımlananlarla değiştirir.
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:
trunk
bir hedef dizine kopyalamak ,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 switch
gerçekten svn update
kı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-submodule
ancak 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 heads
denir tips
ve branches
olan bookmarks
cıva terminolojisinde yerine.
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.
Bir şubenin gerçek maliyeti onu birleştiriyor. Git bunu diğer kaynak kontrol sistemlerinden daha kolaylaştırır. Yığın Taşması sorusuna bakın Git'te neden ve / veya neden birleşmesi SVN'den daha iyi? .
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ş.
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.
'Ü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ı').
"Ü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.