Ders 01 / 15
Sürüm Kontrolü Nedir
Sürüm kontrolünün çözdüğü problem; tarihçe, geri alınabilirlik ve işbirliği sözleri; anlık görüntü ile fark tabanlı saklamanın karşılaştırılması.
İçindekiler
Programlama Temelleri kursunda bir programın nasıl yazıldığı ele alındı; bu kurs, yazılan programın zaman içinde nasıl değiştiğiyle ilgilenir. Bir dosya bir kez yazılıp bırakılmaz: düzeltilir, genişletilir, bozulur, geri alınır. Bu değişim dizisini kayıt altına almadan çalışmak, yalnızca son hâli bilinen bir program üretir.
Bu ders sürüm kontrolünün çözdüğü problemi tanımlar ve çözümün taşıdığı üç sözü ayırır. Komutlar bir sonraki konuda başlar; burada kurulan model, kursun geri kalanında kullanılacak sözcük dağarcığıdır.
Elle Sürüm Yönetimi ve Sınırları
Kayıt tutmanın en dolaysız yolu kopyalamaktır: dosyanın bir sürümü çalışmaya başlamadan önce yedeklenir, sonraki sürüm ayrı bir adla saklanır. Sonuçta şuna benzer bir dizin oluşur:
ara.sh ara-yedek.sh ara-calisan.sh ara-son.sh ara-son-2.sh
Bu düzenin dört ayrı kusuru vardır ve dördü de yapısaldır:
- Sıra bilgisi yoktur. Dosya adları hangi sürümün hangisinden türediğini söylemez.
ara-son.shileara-calisan.sharasındaki ilişki yalnızca yazan kişinin belleğindedir. - Gerekçe kaydı yoktur. Bir satırın neden değiştiği hiçbir yerde yazmaz. Altı ay sonra aynı satıra bakan kişi, değişikliğin bir düzeltme mi yoksa deneme mi olduğunu bilemez.
- Değişiklik bütünlüğü yoktur. Bir düzeltme çoğu zaman birden çok dosyaya dokunur. Dosya başına kopyalama, bu dosyaların hangi anda birlikte tutarlı olduğunu kaydetmez.
- Eşzamanlı çalışma tanımsızdır. İki kişi aynı dosyanın kopyalarını ayrı ayrı değiştirirse, iki kopyayı birleştirmenin kuralı yoktur; biri diğerini ezer.
Sürüm kontrol sistemi (version control system), bu dört kusuru gidermek üzere tasarlanmış bir kayıt düzenidir. Değişiklikleri dosya dosya değil, işleme (commit) adı verilen bütünler hâlinde saklar; her işlemeye bir gerekçe metni, bir yazar ve bir öncül bağlar.
Üç Söz
Sürüm kontrolünün sunduğu güvenceler üç başlıkta toplanır.
Tarihçe. Her işleme, o andaki proje durumunun tamamını temsil eder ve kendisinden önceki işlemeye bağlanır. Bu bağ zinciri, “bu satır ne zaman, kim tarafından, hangi gerekçeyle yazıldı” sorusunu yanıtlanabilir kılar. Kod okumanın önemli bir bölümü bu sorunun yanıtlanmasıyla geçer.
Geri alınabilirlik. Kayıt altına alınmış her durum yeniden elde edilebilir. Bu, cesur değişiklik yapmayı ucuzlatır: bir denemenin bedeli, denemeyi geri almanın maliyetidir. Maliyet düşükse deneme sayısı artar. Kursun üçüncü konusu bu geri alma araçlarına ayrılmıştır.
İşbirliği. Birden çok kişinin aynı proje üzerinde çalışması, değişikliklerin birleştirilmesini gerektirir. Sürüm kontrol sistemi, her değişikliğin hangi ortak atadan türediğini bildiği için birleştirmeyi kurallı bir işleme dönüştürür. Bu kursta işbirliği yalnızca tasarım kararlarının gerekçesi olarak geçecek; uygulaması Dallanma ve İşbirliği kursunun konusudur.
Anlık Görüntü mü, Fark mı
Bir sistemin tarihçeyi nasıl sakladığı, sunabileceği işlemleri belirler. İki temel tasarım vardır.
Fark tabanlı saklama. Sistem, ilk sürümü tam olarak saklar; sonraki her sürüm için yalnızca önceki sürümden farkı kaydeder. Depolama açısından ekonomiktir. Bedeli, herhangi bir sürümü elde etmek için baştan başlayıp farkları sırayla uygulamaktır: . sürüme erişmenin maliyeti ’dir.
Anlık görüntü (snapshot) tabanlı saklama. Sistem, her kayıt anında projenin tüm dosya ağacının bir görüntüsünü saklar. Bir sürüme erişmek doğrudan o görüntüye bakmaktır: . İlk bakışta savurgan görünür — her kayıtta tüm dosyalar yeniden mi yazılacaktır?
Savurganlığı ortadan kaldıran şey içerik adresli depolama (content-addressed storage) fikridir. Her dosya içeriği, içeriğinden hesaplanan bir karma (hash) değeriyle adlandırılır ve bu adla saklanır. Aynı içerik iki kez saklanmaz; değişmeyen dosyalar ardışık anlık görüntülerde aynı nesneyi paylaşır. Veri Yapıları kursunda karma fonksiyonlarının çığ etkisi ve çakışma olasılığı incelenmişti; burada aynı fonksiyonlar bir kimlik üreticisi olarak kullanılır.
Böylece anlık görüntü modeli, fark modelinin depolama avantajını büyük ölçüde korurken sürüme
erişimi sabit maliyete indirir. Bu kursta anlatılan sistem — git — anlık görüntü modelini
kullanır.
Tarihçenin Biçimi
Tarihçe basit bir liste değildir. Her işleme bir öncül işlemeye bağlanır; bir işlemenin birden çok ardılı olabilir (aynı noktadan iki ayrı yön denenmiştir) ve bir işlemenin birden çok öncülü olabilir (iki yön birleştirilmiştir). Bağlar geçmişe doğru yönlüdür ve bir işleme kendi atası olamaz.
Bu üç özellik, tarihçenin bir yönlü çevrimsiz çizge olduğunu söyler. Veri Yapıları kursunda bu yapı tanımlanmış, Algoritmalar kursunda topolojik sıralaması ele alınmıştı. Buradaki karşılıklar birebirdir:
| Çizge kavramı | Tarihçedeki karşılığı |
|---|---|
| Düğüm | Bir işleme |
| Kenar | İşlemeden öncülüne bağ |
| Çevrimsizlik | Bir işleme kendi atası olamaz |
| Topolojik sıra | Tarihçenin okunabilir bir sırayla listelenmesi |
| Ortak ata | İki yönün ayrıldığı işleme |
Bir tarihçe listesinin “en yeniden en eskiye” sıralanması, çizgenin topolojik sıralarından biridir. Dallanma olmayan bir tarihçede bu sıra tektir; dallanma varsa birden çok geçerli sıra bulunur ve sistem hangisini göstereceğini seçmek zorundadır.
(A) ← (B) ← (C) ← (D) dallanmasız tarihçe: tek zincir
┌── (C) ← (D)
(A) ← (B) ←─┤ dallanmış tarihçe: iki yön
└── (E)
Oklar geçmişe doğrudur: her düğüm kendi öncülünü gösterir. Bir işleme yazıldıktan sonra içeriği değişmez; tarihçe yalnızca uçlarından büyür. Bu değiştirilemezlik, geri alma araçlarının nasıl çalıştığını anlamanın anahtarıdır ve üçüncü konuda tekrar karşımıza çıkacaktır.
Yedekleme ile Aynı Şey Değildir
İki düzen de “eski hâli geri getirme” sözü verdiği için karıştırılır; verdikleri söz farklıdır.
Yedekleme, bir zaman noktasındaki durumu kurtarmak için tutulur. Amacı veri kaybını önlemektir; kimin neyi neden değiştirdiğini kaydetmez, iki kişinin çalışmasını birleştirme kuralı sunmaz. Yedeğin değeri, gereken anda son durumu geri verebilmesindedir.
Sürüm kontrolü, durumların dizisini ve her adımın gerekçesini tutar. Kurtarma yalnızca bir sonucudur; asıl ürettiği bilgi, değişimin kendisidir.
İkisi birbirinin yerine geçmez. Bir depo yalnızca bir makinede duruyorsa, o makinenin kaybolması tarihçeyi de götürür; sürüm kontrolü kullanmak yedeklemeyi gereksizleştirmez. Bir sonraki ders, dağıtık modelin bu riski nasıl dağıttığını gösterecek.
Ayrım, neyin kaydedileceği sorusunu da belirler. Depoya giren şey, insan tarafından yazılmış ve gerekçesi olan içeriktir: kaynak dosyalar, yapılandırma, belgeler. Derleme çıktıları ve indirilen bağımlılıklar kaynaklarından yeniden üretilebildiği için tarihçede yer tutmaları gereksizdir; gizli anahtarlar ise tarihçeye bir kez girdiğinde kalıcı olduğu için hiç girmemelidir. Bu ayrımın uygulaması, Yoksayma Kuralları dersinin konusudur.
Kursun Örnek Deposu
Kurs boyunca tek bir örnek proje kullanılacaktır: sozluk adlı küçük bir çalışma. İçinde üç
dosya bulunur — bir açıklama belgesi, satır satır terim tutan bir metin dosyası ve bu dosyada
arama yapan bir kabuk betiği. Proje sıfırdan kurulacak, her ders tarihçeyi bir adım
ilerletecek, üçüncü konudaki dersler aynı depoda kasıtlı hatalar yapıp bunları geri alacaktır.
Örneğin küçük olması bilinçlidir: dosya sayısı azaldıkça, nesne veritabanının içeriğini doğrudan inceleyip modeli gözle doğrulamak mümkün hâle gelir. Kursun amacı komut listesi ezberletmek değil, bu modeli kurmaktır; komutlar modelden türetilebildiği ölçüde akılda kalır.
Özet
- Elle kopyalayarak sürüm tutmak sıra, gerekçe, değişiklik bütünlüğü ve eşzamanlılık bilgisini kaybettirir.
- Sürüm kontrol sistemi değişiklikleri dosya başına değil, işleme adı verilen bütünler hâlinde saklar.
- Üç temel söz vardır: tarihçe, geri alınabilirlik ve işbirliği.
- Fark tabanlı saklama depolamada, anlık görüntü tabanlı saklama erişimde ucuzdur; içerik adresli depolama ikinci modelin depolama maliyetini düşürür.
- Tarihçe bir yönlü çevrimsiz çizgedir; düğümler işlemeler, kenarlar öncül bağlarıdır.
- Yedekleme son durumu kurtarır, sürüm kontrolü durumların dizisini ve gerekçesini tutar; ikisi birbirinin yerine geçmez.
Sonraki Adım
Sürüm kontrolünün ne olduğu tanımlandı; ancak tarihçenin nerede tutulduğu sorusu açık kaldı. Tek bir sunucuda mı, yoksa her katılımcının makinesinde eksiksiz bir kopya hâlinde mi? Bu seçim, sistemin hangi işlemleri ağ bağlantısı olmadan yapabileceğini ve bir arıza durumunda neyin kaybolacağını belirler. Sonraki ders bu iki tasarımı ve sonuçlarını karşılaştıracak.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.