GIT ve CVS arasındaki fark


126

Git ve CVS sürüm kontrol sistemleri arasındaki fark nedir?

CVS'yi 10 yılı aşkın süredir mutlu bir şekilde kullanıyorum ve şimdi Git'in çok daha iyi olduğu söylendi. Birisi lütfen ikisi arasındaki farkın ne olduğunu ve neden birinin diğerinden daha iyi olduğunu açıklayabilir mi?


1
Linus'un (git'in orijinal yazarı) bu konuşması hemen hemen özetliyor. Google Tech Talks: Git'te Linus Torvalds Dikkat: Son derece kararlı konuşma.
kungfoo

cvs çok eski ve bir programcının bunu çalıştırabileceğine inanamıyorum.
PersianGulf

10
Bu soru 8 yıl önce soruldu. Şu anda GIT kullanıyorum.
jay

6
Bir şeyin eski olması onu kötü yapmaz.
Justin Meiners

Yanıtlar:


338

Temel fark, (diğer yanıtlarda da söylendiği gibi) CVS'nin (eski) merkezi sürüm kontrol sistemidir, oysa Git dağıtılır.

Ancak, tek bir makinede (tek hesap) tek geliştirici için sürüm kontrolünü kullansanız bile, Git ve CVS arasında birkaç fark vardır:

  • Depo kuruluyor . Git, depoyu .gitprojenizin üst dizinindeki dizinde depolar ; CVS, farklı projeler (modüller) için sürüm kontrol bilgilerini depolamak için merkezi bir yer olan CVSROOT'un kurulmasını gerektirir. Kullanıcı için bu tasarımın sonucu, mevcut kaynakların sürüm kontrolüne aktarılmasının Git'te "git init && git add. && git commit" kadar basit, CVS'de ise daha karmaşık olmasıdır .

  • Atomik işlemler . Başlangıçta CVS, dosya başına RCS sürüm kontrol sistemi etrafında bir dizi betik olduğundan, taahhütler (ve diğer işlemler) CVS'de atomik değildir; Depodaki bir işlem ortada kesintiye uğrarsa, depo tutarsız bir durumda bırakılabilir. Git'te tüm işlemler atomiktir: ya bütün olarak başarılı olurlar ya da herhangi bir değişiklik olmadan başarısız olurlar.

  • Değişiklik kümeleri . CVS'deki değişiklikler dosya başınadır, Git'teki değişiklikler (taahhütler) ise her zaman tüm projeyi ifade eder. Bu çok önemli bir paradigma değişimidir . Bunun sonuçlarından biri, Git'te geri dönmenin (geri alan bir değişiklik yaratmanın) veya tüm değişikliği geri almanın çok kolay olmasıdır ; diğer bir sonuç da, CVS'de kısmi kontroller yapmanın kolay olmasına karşın, şu anda Git'te neredeyse imkansız olmasıdır. Değişikliklerin dosya başına olması, birlikte gruplandırılması gerçeği, CVS'deki commit mesajları için GNU Changelog formatının icat edilmesine yol açtı; Git kullanıcıları, değişikliği açıklayan (özetleyen) tek satır, ardından boş bir satır ve ardından değişikliklerin daha ayrıntılı açıklamasıyla farklı kurallar kullanır (ve bazı Git araçları bekler).

  • Revizyonları / sürüm numaralarını adlandırmak . CVS'de değişikliklerin dosya başına olmasıyla bağlantılı başka bir sorun daha var: sürüm numaraları (bazen anahtar kelime genişletmede görebileceğiniz gibi, aşağıya bakın), verilen dosyanın kaç kez değiştirildiğini yansıtır. Git'te bir projenin her sürümünün bir bütün olarak (her işleme), SHA-1 kimliği tarafından verilen benzersiz adı vardır; genellikle ilk 7-8 karakter bir kaydetmeyi tanımlamak için yeterlidir (merkezi numaralandırma yetkisi gerektiren dağıtılmış sürüm kontrol sistemindeki sürümler için basit numaralandırma şeması kullanamazsınız). CVS'de, bir bütün olarak projenin durumuna atıfta bulunan sürüm numarası veya sembolik ada sahip olmak için etiketleri kullanırsınız; bir projenin bazı sürümleri için 'v1.5.6-rc2' gibi bir ad kullanmak istiyorsanız aynı şey Git'te de geçerlidir ... ancak Git'teki etiketlerin kullanımı çok daha kolaydır.

  • Kolay dallanma . CVS'deki şubeler bence aşırı karmaşık ve uğraşması zor. Dalları, tüm bir depo dalı için bir ada sahip olacak şekilde etiketlemeniz gerekir (ve hatta bazı durumlarda, doğru hatırlıyorsam, dosya başına işleme nedeniyle bu başarısız olabilir). Buna CVS'nin birleştirme izleme özelliğine sahip olmadığı gerçeğini de ekleyin; bu nedenle, birleştirme ve dallanma noktalarını hatırlamanız veya manuel olarak etiketlemeniz ve dalları birleştirmek için "cvs update -j" için doğru bilgileri manuel olarak sağlamanız gerekir ve bu, dallanmayı sağlar. gereksiz, kullanımı zor. Git'te dal oluşturmak ve birleştirmek çok kolaydır; Git gerekli tüm bilgileri kendi başına hatırlar (bu nedenle bir dalı birleştirmek "git birleştirme dal adı " kadar kolaydır ) ... bunu yapmak zorundaydı çünkü dağıtılmış geliştirme doğal olarak birden çok dala yol açar.

    Bu, konu dallarını kullanabileceğiniz anlamına gelir , yani ayrı özellik dalında birden çok adımda ayrı bir özellik geliştirebilirsiniz.

  • İzlemeyi yeniden adlandırın (ve kopyalayın) . Dosya yeniden adları CVS'de desteklenmez ve manuel yeniden adlandırma, geçmişi ikiye bölebilir veya yeniden adlandırmadan önce bir projenin durumunu doğru şekilde kurtaramayacağınız geçersiz geçmişe neden olabilir. Git, içerik ve dosya adının benzerliğine dayalı olarak sezgisel yeniden adlandırma algılamasını kullanır (Bu çözüm pratikte iyi çalışır). Dosyaların kopyalanmasının algılanmasını da talep edebilirsiniz. Bunun anlamı şudur ki:

    • belirtilen kaydetmeyi incelerken, bazı dosyanın yeniden adlandırıldığı bilgisini alırsınız,
    • doğru bir şekilde birleştirildiğinde yeniden adlar dikkate alınır (örneğin, dosya yalnızca bir dalda yeniden adlandırılmışsa)
    • Bir dosya içeriğinin satır bazında geçmişini gösteren bir araç olan "cvs annotate" in (daha iyi) eşdeğeri olan "git blame", yeniden adlarda da kod hareketini takip edebilir
  • İkili dosyalar . CVS, ikili dosyalar (ör. Görüntüler) için yalnızca çok sınırlı bir desteğe sahiptir ve kullanıcıların, karışıklıktan kaçınmak için ikili dosyaları eklerken (veya daha sonra "cvs admin" kullanarak veya bunu otomatik olarak yapmak için sarmalayıcılar aracılığıyla) açıkça işaretlemesini gerektirir. satır sonu dönüştürme ve anahtar kelime genişletme yoluyla ikili dosya. Git, CNU diff ve diğer araçların yaptığı gibi, içeriğe dayalı olarak ikili dosyayı otomatik olarak algılar; gitattributes mekanizmasını kullanarak bu algılamayı geçersiz kılabilirsiniz. Üstelik ikili dosyalar, 'safecrlf' varsayılanı (ve dağıtıma bağlı olarak varsayılan olarak açılmış olsa da hat sonu dönüştürme istemeniz gerektiği gerçeği) ve bu (sınırlı) anahtar kelime sayesinde kurtarılamayan karıştırmaya karşı güvenlidir. genişletme, Git'te katı bir 'seçmedir'.

  • Anahtar kelime genişletme . Git, CVS'ye kıyasla (varsayılan olarak) çok, çok sınırlı bir anahtar kelime kümesi sunar. Bunun nedeni iki olgudur: Git'teki değişiklikler dosya başına değil depo başına yapılır ve Git, başka bir dala geçerken veya geçmişte başka bir noktaya geri sarılırken değişmeyen dosyaları değiştirmekten kaçınır. Revizyon numarasını Git kullanarak gömmek istiyorsanız, bunu derleme sisteminizi kullanarak yapmalısınız, örneğin Linux çekirdek kaynaklarında ve Git kaynaklarında aşağıdaki GIT-VERSION-GEN komut dosyası örneği.

  • Taahhütleri değiştirme . Git gibi dağıtılmış VCS'de yayınlama eylemi bir kaydetme oluşturmaktan ayrı olduğundan, diğer kullanıcıları rahatsız etmeden geçmişin yayınlanmamış kısımlarını değiştirebilir (düzenleyebilir, yeniden yazabilir). Özellikle commit mesajında ​​yazım hatası (veya başka bir hata) ya da commit'de bir hata fark ederseniz, "git commit --amend" i kullanabilirsiniz. CVS'de bu mümkün değildir (en azından ağır bilgisayar korsanlığı olmadan).

  • Daha fazla araç . Git, CVS'den çok daha fazla araç sunar. Daha da önemlisi, hata veren bir commit (revizyon) bulmak için kullanılabilen " git bisect " dir; Eğer taahhütleriniz küçükse ve kendi kendine yetiyorsa, hatanın nerede olduğunu keşfetmek oldukça kolay olacaktır.


En az bir başka geliştiriciyle işbirliği yapıyorsanız, Git ve CVS arasında aşağıdaki farklılıkları da bulacaksınız:

  • Birleştirmeden önce tamamla Git , CVS gibi birleştirmeden önce birleştir (veya güncelle-sonra-kaydet ) yerine birleştirmeden önce kesin kullanır . Dosyaları düzenlerken, başka biri aynı dalda yeni bir kayıt oluşturmaya (yeni revizyon) hazırlanırken ve o artık depodaysa, CVS sizi kaydetmenize izin vermeden önce ilk olarak çalışma dizininizi güncellemeye ve çakışmaları çözmeye zorlar. Git ile durum böyle değil. Önce taahhüt edersiniz, durumunuzu sürüm kontrolüne kaydedersiniz, ardından diğer geliştirici değişikliklerini birleştirirsiniz. Diğer geliştiriciden birleştirme işlemini yapmasını ve çakışmaları çözmesini de isteyebilirsiniz.

    Doğrusal bir geçmişe sahip olmayı ve birleşmelerden kaçınmayı tercih ederseniz, CVS'ye benzer şekilde "git rebase" (ve "git pull --rebase") aracılığıyla commit-merge-recommit iş akışını her zaman kullanabilirsiniz. güncel durum. Ama her zaman önce taahhüt edersiniz.

  • Merkezi depoya gerek yok Git ile, değişikliklerinizi gerçekleştirdiğiniz tek bir merkezi yere sahip olmanıza gerek yoktur. Her geliştiricinin kendi deposu olabilir (veya daha iyi depoları: geliştirme yaptığı özel depo ve hazır olan kısmı yayınladığı herkese açık depo) ve birbirlerinden depoları çekebilir / getirebilirler. simetrik moda. Öte yandan, daha büyük bir projenin, herkesin içinden aldığı (değişiklikleri aldığı) sosyal olarak tanımlanmış / atanmış merkezi depoya sahip olması yaygındır .


Son olarak Git, çok sayıda geliştiriciyle işbirliğine ihtiyaç duyulduğunda çok daha fazla olanak sunar. Aşağıda, bir projedeki farklı ilgi aşamaları ve pozisyon için Git'teki CVS arasında farklılıklar vardır (CVS veya Git kullanılarak sürüm kontrolü altında):

  • pusuda . Yalnızca bir projeden en son değişiklikleri almakla ( değişikliklerinizin yayılması olmadan ) veya özel geliştirme yapmakla ilgileniyorsanız (orijinal projelere katkıda bulunmadan); veya yabancı projeleri kendi projenizin temeli olarak kullanırsınız (değişiklikler yereldir ve bunları yayınlamak mantıklı değildir).

    Git burada özel verimli protokol aracılığıyla anonim, kimliği doğrulanmamış salt okunur erişimi destekler git://veya güvenlik duvarı engellemesinin DEFAULT_GIT_PORT(9418) arkasındaysanız düz HTTP'yi kullanabilirsiniz.

    CVS için salt okunur erişim için en yaygın çözüm (anladığım kadarıyla) , (2401) üzerindeki 'pserver' protokolü için misafir hesabıdırCVS_AUTH_PORT , genellikle "anonim" olarak adlandırılır ve boş parola ile. Kimlik bilgileri varsayılan olarak $HOME/.cvspassdosyada saklanır , bu nedenle yalnızca bir kez sağlamanız gerekir; yine de, bu biraz engel (misafir hesabının adını bilmeniz veya CVS sunucu mesajlarına dikkat etmeniz gerekir) ve rahatsızlıktır.

  • saçak geliştirici (yaprak katkısı) . OSS'deki değişikliklerinizi yaymanın bir yolu, yamaları e-posta yoluyla göndermektir . Bu, yanlışlıkla geliştiriciyseniz (aşağı yukarı), tek değişiklik veya tek hata düzeltme gönderiyorsanız en yaygın çözümdür. BTW. Yama göndermek yalnızca e-posta yoluyla değil, inceleme panosu (yama inceleme sistemi) veya benzer yollarla olabilir.

    Git burada hem gönderen (istemci) hem de bakımcı (sunucu) için bu yayılma (yayınlama) mekanizmasında yardımcı olan araçlar sunar. Değişikliklerini e-posta yoluyla göndermek isteyen kişiler için, kendi değişikliklerinizi mevcut yukarı akış sürümünün üzerine yeniden oynatmak için " git rebase " (veya "git pull --rebase") aracı vardır, böylece değişiklikleriniz mevcut sürümün üstündedir (yenidir) ) ve kaydetme mesajı (ve yazarlık) içeren e-posta oluşturmak için " git format-patch ", (genişletilmiş) birleşik fark biçimi biçiminde değişiklik (artı daha kolay inceleme için diffstat). Maintainer, bu tür bir e-postayı " git am " kullanarak tüm bilgileri (commit mesajı dahil) koruyarak doğrudan commit haline getirebilir .

    CVS böyle bir araç sunmaz: değişiklikleri oluşturmak için "cvs diff" / "cvs rdiff" kullanabilir ve değişiklikleri uygulamak için GNU yamasını kullanabilirsiniz, ancak bildiğim kadarıyla commit mesajını uygulamayı otomatikleştirmenin bir yolu yoktur. CVS, istemci <-> sunucu tarzında kullanılmak üzere tasarlanmıştı ...

  • teğmen . Bir projenin (alt sistemin) ayrı bir bölümünün bakımcısıysanız veya projenizin geliştirilmesi Linux çekirdeğinin geliştirilmesinde kullanılan "güven ağı" iş akışını takip ediyorsa ... veya sadece kendi genel deponuz varsa ve yayınlamak istiyorsanız yama serisi olarak e-posta ile gönderilemeyecek kadar büyükse , projenin (ana) koruyucusuna çekme isteği gönderebilirsiniz .

    Bu, dağıtılmış sürüm kontrol sistemlerine özgü bir çözümdür , dolayısıyla CVS bu tür bir işbirliğini desteklemez. Deponuzdan veri çekme isteği ile bakım görevlisine gönderilecek e-postayı hazırlamaya yardımcı olan "git request-pull" adlı bir araç bile var. "Git paketi" sayesinde, e-posta veya sneakernet yoluyla değişiklik paketi göndererek, herkese açık depoya sahip olmadan da bu mekanizmayı kullanabilirsiniz. GitHub gibi bazı Git barındırma siteleri , birisinin projenizde çalıştığını (bazı çalışmalar yayınladığını) bildirme (aynı Git barındırma sitesini kullanması koşuluyla) ve bir tür çekme isteğine PM-ing için destek sağlar.

  • ana geliştirici , yani değişikliklerini doğrudan yayınlayan biri (ana / kanonik depoya). Bu kategori, dağıtılmış sürüm kontrol sistemleri için daha geniştir, çünkü merkezi depoya yazma erişimi olan birden fazla geliştiriciye sahip olmak yalnızca olası iş akışı değildir ( değişiklikleri kanonik depoya iten tek bir bakıcıya, bir dizi yardımcı / alt sistem koruyucusuna sahip olabilirsiniz. posta yoluyla ya bakımcı / proje posta listesine ya da teğmenlerden / alt bakıcılardan birine posta yoluyla yama gönderen çok çeşitli yaprak geliştiricileri).

    Git ile değişiklikleri yayınlamak için SSH protokolünü (SSH'ye sarılmış git protokolü), "git shell" (güvenliğe yardımcı olmak, kabuk hesaplarına erişimi sınırlandırmak için) veya Gitosis (ayrı kabuk hesapları gerektirmeden erişimi yönetmek için ) kullanma seçeneğine sahipsiniz. ) ve WebDAV ile HTTPS , sıradan HTTP kimlik doğrulaması ile.

    CVS ile, özel şifrelenmemiş (düz metin) pserver protokolü veya değişikliklerinizi yayınlamak için uzak kabuk (gerçekten SSH'yi kullanmanız gereken yer) kullanmak arasında bir seçim vardır ; bu, merkezi sürüm kontrol sistemi için değişikliklerinizi yapmak (taahhütler oluşturmak) anlamına gelir. SSH'yi kullanarak 'pserver' protokolünü de tünelleyebilirsiniz ve bunu otomatikleştiren üçüncü taraf araçları vardır ... ancak bunun Gitosis kadar kolay olduğunu sanmıyorum.

Genel olarak, Git gibi dağıtılmış sürüm kontrol sistemleri, olası iş akışlarının çok daha geniş bir seçimini sağlar. CVS gibi merkezi sürüm kontrol sistemlerinde, zorunlu olarak, depoya kesin erişim yetkisi olan ve olmayanlar arasında ayrım yapmanız gerekir ... ve CVS, olmayan kişilerin katkılarını (yamalar aracılığıyla) kabul etmeye yardımcı olacak herhangi bir araç sunmaz. erişim işlemek.

Sürüm kontrolü ile ilgili Açık Kaynak Yazılım Üretme bölümünde Karl Fogel, bir kişinin genel depoda değişiklik yapmasına izin verilen alanlarda çok katı, katı ve sıkı kontroller sağlamamanın daha iyi olduğunu belirtiyor; sosyal kısıtlamalara (kod incelemesi gibi) güvenmek (bunun için) teknik kısıtlamalardan çok daha iyidir; dağıtılmış sürüm kontrol sistemleri bu IMHO'yu daha da azaltır ...

HTH (Yardımcı Olur Umut)


3
Jakub, GIT'in beş maden yazarından biri olarak listelendi, bu nedenle kapsamlı bir cevap. Dünyayı yöneten yasalar kolay olsaydı, daha iyi cevap verebilecek sadece dört kişi olurdu;)
samuil

1
@samuil: Git'in yazarlarından biri değilim. Kaydetme sayısı her şey değildir. Ben sadece gitweb (git web arayüzü) alanında aktifim.
Jakub Narębski

1
CVS ve GIT arasında bir karşılaştırma tablosu istemiştim ama bu cevap çok daha iyi. Bunun için +1! :) Referans olarak kullanmayı umduğum başka bir faydalı makale daha var ( thinkvitamin.com/code/… ), ancak bu cevap kadar iyi olmasa da. :)
Android Eve

4

Git, CVS'nin merkezi olması aksine bir DVCS'dir . Eğer bağlı olmadığınızda sürüm kontrolü tüm avantajları sağlar: Simplistic açıklama olacak herhangi çoklu olası havuzlarından, artı işlemler daha hızlı.


4

Git web sitesi bunu muhtemelen en iyi şekilde açıklıyor.

Evcil hayvanım özelliği çevrimdışıyken kaydetme yapabiliyor. Ve itme ve çekme dışında her şeyin gerçekleştiği hız, inanılmaz hız. (Ve bu işlemler tasarım gereği tahribatsızdır, bu yüzden merkezi deponuz gecikirse bir kahve kapmaya gittiğinizde itebilir / çekebilirsiniz.) Bir başka güzel şey de pillerin dahil olması: yerleşik gitkyeterince iyi bir tarih görüntüleyici; git guiyeterince iyi bir commit aracıdır; çıkış renklendirme ile git add -i, git add -p, git rebase -iyeterince iyi interaktif arayüzleri vardır; git daemonve git instawebmerkezi deponuzla uğraşmak istemiyorsanız / yapamıyorsanız geçici işbirliği için yeterince iyidir.


3

Ayrıca 10+ yıllık çoğunlukla mutlu bir cv kullanıcısıyım, gerçi git'i de severim ve zamanla onu tercih etmeye başlayacağım, halihazırda üzerinde çalıştığım projelerin çoğu cv veya svn kullanıyor ve görünemiyoruz çalıştığım bürokrasiyi, güvenlik duvarından geçmemize izin vermeye ikna etmek için.

CV'leri normalde olduğundan daha güzel kılan birkaç şey cvsps, diğeri ise Andrew Morton'ın yama komut dosyaları veya yorgan. Cvsps, yorgan veya Andrew Morton'un yama komut dosyaları, oldukça kolay ve rahat bir şekilde cv'lere mantıklı "değişiklikler" yapmanıza izin verirken, bir işlemenin birden çok dosyasını tek bir yama halinde yeniden oluşturmanıza (ve böylece CVS'den "değişiklikleri" çıkarmanıza) olanak tanır. taahhütte bulunmadan önce onları ayrı tutarken aynı anda birden fazla şey üzerinde çalışın. CVS'nin tuhaflıkları var ama ben çoğuna alışkınım.


2

"CVS'yi x yılı aşkın süredir mutlu bir şekilde kullanmak", ilginç bir fikir :-) Çok sayıda kopya saklamaktan çok daha büyük bir adım ama ...

Sanırım tüm tuhaflıklarına alıştınız veya çok fazla dallanma ve birleştirme yapmıyorsunuz. Daha kötü bir olasılık var;

Kuruluşunuzdaki insanlar özgeçmiş sınırlamalarına alıştı ve iş uygulamalarınız buna göre uyarlandı;

örneğin aynı anda bir paket üzerinde birden fazla geliştiricinin çalışmaması, yalnızca acil durumlarda dallara ayırma vb.

Temel ilke, bir şey ne kadar zorsa, insanların o kadar az yapmasıdır.

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.