Git nasıl tasarlandı?


9

İşyerim kısa bir süre önce Git'e geçti ve ben onu sevdim (ve nefret ediyorum!). Gerçekten çok seviyorum ve son derece güçlü. Nefret ettiğim tek bölüm bazen çok güçlü (ve belki biraz teri / kafa karıştırıcı) olmasıdır.

Benim sorum ... Git nasıl tasarlandı? Sadece kısa bir süre için kullandığınızda, diğer sürüm kontrol sistemlerinin yapamadığı birçok belirsiz iş akışını işleyebileceğini hissedersiniz. Ama aynı zamanda altında zarif hissettiriyor. Ve hızlı!

Bu şüphesiz kısmen Linus'un yeteneğidir. Ama merak ediyorum, git'in genel tasarımı bir şeye dayanıyordu? BitKeeper hakkında okudum, ancak hesaplar teknik detaylarda yetersiz. Sıkıştırma, grafikler, revizyon numaralarından kurtulma, dallanma, saklanma, uzaktan kumandaların vurgulanması ... Hepsi nereden geldi?

Linus gerçekten bu parkın dışına çaldı ve hemen hemen ilk denemede! Öğrenme eğrisini geçtikten sonra kullanmak oldukça iyidir.


muhtemelen git IRC kanalında biraz yardım alabilirsin (freenode üzerinde #git)
yati sagade


2
you get the feel that it can handle many obscure workflows that other version control systems could not: Muhtemelen kötü şöhretli, huysuz, büyük ve karmaşık bir kod parçası olan linux çekirdeğini işlemek için tasarlandığı için.
yannis

Yanıtlar:


17

Git, evrimleştiği kadar tasarlanmamıştır .

Kendinize bir bakın. Resmi git deposunu klonlayın , açın gitk(veya en sevdiğiniz grafik git günlük görüntüleyicisini) ve en eski revizyonlarına bakın.

Başlangıçta sadece en temel işlevlere (nesne veritabanı ve dizin) sahip olduğunu göreceksiniz. Diğer her şey elle yapıldı . Bununla birlikte, bu küçük çekirdek kabuk komut dosyası oluşturma yoluyla kolayca otomatikleştirilecek şekilde tasarlanmıştır. Git'in ilk kullanıcıları, ortak görevleri otomatikleştirmek için kendi kabuk komut dosyalarını yazdılar; yavaş yavaş bu betikler git dağılımına dahil edildi (önceki örnek 839a7a0'a bakın ). Her yeni ihtiyaç olduğunda, komut dosyaları buna izin verecek şekilde uyarlandı. Daha sonra, bu senaryoların birçoğu C'de yeniden yazılacaktır.

Üzerinde organik olarak büyüyen bir üst tabaka ile temiz, dik bir çekirdeğin (eğer ihtiyacınız varsa hala doğrudan kullanabilirsiniz) bu kombinasyonu git gücünü verir. Tabii ki, ona çok sayıda garip adlandırılmış komut ve seçenek veren de budur.


Sıkıştırma, grafikler, revizyon numaralarından kurtulma, dallanma, saklanma, uzaktan kumandaların vurgulanması ... Hepsi nereden geldi?

Bunların çoğu başlangıçta yoktu.

Her nesne ayrı ayrı sıkıştırılmış ve yinelemeleri adlandırmalarından kaçınılmış olsa da, git'te görmeye alışkın olduğumuz yüksek sıkıştırmadan sorumlu olan "paket" dosyaları yoktu. Başlangıçta felsefe "disk alanı ucuz" idi.

"Grafikler" ile grafik izleyicileri seviyorsanız gitk, daha sonra ortaya çıktılar (AFAIK, birincisi gitk). AFAIK, BitKeeper'ın grafiksel bir tarih görüntüleyicisi de vardı.

Sürüm numaralarından kurtulmak, aslında git'in nesneleri depolamak için içeriğe yönelik bir dosya sistemi kullanma temel konsepti, çoğunlukla monotondan geldi . O zaman, monoton yavaştı; durum böyle olmasaydı, Linus git oluşturmak yerine onu kullanmış olabilirdi.

Her bir klon ayrı bir dal olarak hareket ettiğinden, dallanmanın vurgulanması dağıtılmış bir versiyon kontrol sisteminde bir şekilde kaçınılmazdır.

Stashing ( git stash), IIRC, oldukça yenidir. Kullandığı refloglar başlangıçta orada değildi.

Uzaktan kumandalar bile başlangıçta yoktu. Başlangıçta, nesneleri kullanarak el ile kopyaladınız rsync.

Bu özelliklerin her biri tek tek eklendi. Hepsi - belki de çoğu - Linus tarafından yazılmadı. Git'in yerine getirmediği bir ihtiyaç hissettiğinde, git'in çekirdek "sıhhi tesisat" katmanı üzerinde yeni bir özellik yaratılabilir ve dahil edilmesi önerilebilir. Eğer iyiyse, git'in faydasını (ve komut satırı karmaşıklığını) daha da geliştirerek muhtemelen kabul edilecektir.


"AFAIK, BitKeeper'ın grafiksel bir tarih görüntüleyicisi de vardı." Evet öyle. Tam olarak hoş değil, ama son derece işlevsel. Bitkeeper.com/Test.Using.Looking.html adresine bakın , ancak bu, dalları nasıl görüntülediğini göstermenin kötü bir işidir.
Bryan Oakley

1
Ayrıca ilginç bir okuma, git başlangıcından birkaç başlangıç ​​e-postasını gösteren ilk e-postalarını gösteriyor: kerneltrap.org/node/4982
CesarB

Programcılar git'in bazı işlevlerini cvs + rsync + httpd ile taklit ediyor muydu? Hangi ev yapımı çözümlerin mümkün olduğunu duymak isterim.
Sridhar Sarnobat

8

Bence asıl nokta git, gezegendeki en kalifiye kişi tarafından tasarlanmıştı. Ve yetenek hakkında konuşmuyorum, deneyimden bahsediyorum: Linux çekirdeği olarak boyut ve sayıdaki katılımcıların karşılaştırılabilir kombinasyonuyla kod tabanından sorumlu olan ve hala entegrasyonun çoğuyla ilgilenen başka biri olduğundan şüpheliyim kendini.

Linus, dağıtılmış bir sürüm kontrol sisteminin gereksinimlerini biliyordu ve vakaları herkesten daha iyi kullandı. Ve elbette, uğraştığı kodlamanın çoğunun C'de olmasına ve çoğunun performans açısından kritik olmasına yardımcı oldu.

Temel olarak, kendi kaşıntısını çizmenin nihai örneği.


6
"Tek kalifiye"? Ben öyle düşünmüyorum. Dağıtılmış kaynak kontrolü yazmaya yetkin birçok akıllı insan var. BitMover (BitKeeper arkasındaki şirket) çocuklar gerçekten gerçekten ne yaptıklarını biliyorum. Linus, kaynak kod kontrolünün nasıl çalışması gerektiğini ona gösterdiği için Larry McVoy'a bile kredi veriyor . Larry olmasaydı git olmazdı.
Bryan Oakley

1
@BryanOakley, sanırım birisi iyi bir şey için birini tamamladığında dayaktan kaçınabiliriz. İçeride herkes bu gereksinimin harika bir geliştirici yaptığını biliyor. Yani, yarın size büyük bir problem sunulursa, Dennis Ritchie gibi sizi hatırlayabiliriz. Kimse diğerinden daha iyi değil, sadece dünya çapında bir gereksinimle karşılaşmış ve önce bir çözüm bulmuşlar.
Pankaj Upadhyay

2
@Bryan: Eminim BitKeeper kullanımındaki deneyim Linus'a da çok şey öğretti ve bundan bahsetmeliydim. Ve elbette, ne yaptıklarını bilen başka birçok akıllı, nitelikli insan var. Ama yine de Linus'un çekirdeği muhafaza etme deneyimini onu en nitelikli, deneyim bakımından yapar . Yanılıyor olabilirim, ama çok sayıda katılımcı ile büyük bir projeyi ve bunlardan sorumlu kişinin hala birlikte çalışacak tüm katılımcıların gerçek kodunu alma konusunda derinden söz ettiği bir yeri gösterebilir misiniz?
Michael Borgwardt

@Pankaj Upadhyay: Kimseye dayak atmıyorum, sadece cevabı neden reddettiğimi açıklıyordum. "İlk önce bir çözüm sağladım" hakkında bir şey söylediniz, bu da git'in bir şekilde "ilk" olduğunu düşündüğünüz anlamına geliyor. Sizce ilk ne oldu? Kesinlikle uzun bir atışla ilk dağıtılmış scm aracı değildi.
Bryan Oakley

1
@DeadMG: Bu ifadenin daha önemli bir kısmı daha sonra "... ve çoğu performans açısından kritik". İyi bilirseniz, C'nin düşük genel yüksek performanslı kodu uygulamak için çok uygun olmadığını iddia edecek birçok kişi bulacağınızdan şüpheliyim.
Michael Borgwardt

6

Hemen hemen Git Parable'da açıklandığı gibi tasarlandı .

Metin düzenleyicisi ve birkaç dosya sistemi komutundan başka bir şeyi olmayan bir bilgisayarınız olduğunu düşünün. Şimdi bu sisteme büyük bir yazılım programı yazmaya karar verdiğinizi düşünün. Sorumlu bir yazılım geliştiricisi olduğunuzdan, daha önce değiştirdiğiniz veya sildiğiniz kodu alabilmeniz için yazılımınızın sürümlerini takip etmek için bir çeşit yöntem icat etmeniz gerektiğine karar vermiş olursunuz. Aşağıda, böyle bir sürüm kontrol sistemini (VCS) nasıl tasarlayabileceğiniz ve bu tasarım tercihlerinin ardındaki mantık hakkında bir hikaye var.

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.