Adem KALIN – Yazılım Mühendisi

Versiyon Yönetim Sistemleri

 

version-control-flowUzun bir süre olmuştu yazmayalı. Takip edenler bilir, mümkün olduğunca daha önce çok değinilmemiş konular üzerine fikirlerimi paylaşmaya çalışıyorum.

Geçen süreç içerisinde aynı yerde uzun süredir çalışıyor olmanın etkisiyle çok  da yeni yada ilginç (!) konular karşıma çıkmamaya başlamıştı. Derken 5-6 ay önce iş değişikliği yaptım ve bu zamana kadar hiç fırsatım olmayan Java dünyası ile tanışmış oldum. Ve bununla beraber tamamen yeni bir yaklaşım, bu yazıya ilham kaynağı olan dağıtık versiyon yönetim sistemi yaklaşımı ile tanışmış oldum. Bu zamana kadar çalışmış olduğum yerlerde hep merkezi versiyon yönetimi mantığında  çalışan uygulamalar kullanmıştım.

Geçiş süreci, felsefesini (evet IT alanında herşeyin bir felsefesi olduğunu düşünen biriyim) anlama sürecim biraz beni zorladı, tool ‘lara alışma süreci ve bunun üzerine performans problemlerini de ekleyince, saç-baş yolduğum noktalar olmadı değil 🙂

Derken, bu yazıyı kafamda planlamaya ve benim gibi sancı çekecek insanlara bir nebze olsun yardımcı olmaya çok önceden karar verdim. Herşeyi yazmaya başlamadan önce yeni görmeye başladığım felsefeye hakim olmam gerekiyordu. Belki hala tam hakim değilimdir, bazı terimleri yanlış kullanabilirim ama kusurlarım  şimdiden affola.

Versiyon (yada Sürüm) Yönetim (yada Kontrol) Sistemleri

Yazılım dünyasının ve takım halinde çalışmanın olmazsa olmazı verisyon/sürümdür. (Bu başlığı, tecrübeli arkadaşlar atlayabilir)

Yazılım gelişen ve her geçen gün yeni özellikler eklenen bir canlıdır adeta. Ve bildiğimiz üzere yaptığımız hiçbir değişikliği de kaybetmek istemeyiz, bazen geçmişte yapılan bir değişikliği, değişiklik zamanını, yapan kişiyi ve eklenmiş ise yorumlarını incelememiz gerekebilir. Hatta bu inceleme çok hayati sebeplerle de olabilir. Bu noktada bizim yardımımıza versiyon yönetim sistemleri koşar gelir.

Piyasada adını sayamayacağımız kadar çok versiyon yönetim sistemi bulunmaktadır. Ben örnek olarak bu zamana kadar çalıştıklarımı aşağıya ekleyip daha fazla detay vermeden geçiyorum, her biri apayrı  dünyalar. (Listedeki her bir ürünün detayına ulaşmak için üstlerine tıklayabilirsiniz) Zaten amacım da onları tanıtmak değil, yaklaşımlar arasındaki farkları ortaya çıkarmak. Tabi bu listenin dışında da bir ton uygulama mevcut piyasada. (Daha detaylı bir liste için : Wikipedia)

2 Farklı Yaklaşım (Felsefe)

Aşağıdaki imajdan da anlaşılacağı üzere, bu alanda 2 farklı yaklaşım bulunmaktadır.version-control-systems

 

  1. Merkezi (Centralized) Versiyon Kontrol

    Merkezi yaklaşımda repository her zaman merkezi bir server üzerinde bulunmaktadır. Kullanıcılar üzerinde çalışacakları dosyayı check out ‘layıp  düzenlemelerini yaptıktan sonra check in (yada commit) yaptıklarında değişiklik merkezi repository’ye gönderilmekte ve yine orada saklanmaya devam edilmektedir. Kullanıcı sadece çalışacağı dosyaları lokaline almaktadır. Dolayısıyla versiyonlama için her zaman online olma ihtiyacı oluşmaktadır.

    Örnek : TFVS (TFS), ClearCase, SourceSafe, CVS, SVN

  2. Dağıtık (Distributed) Versiyon Kontrol

    Dağıtık yaklaşımda ise yine merkezi bir repository bulunmakta ancak her kullanıcı sadece çalışacağı dosyaları değil repository ‘nin bir kopyasını tamamen lokaline almaktadır. Kullanıcı dosyası üzerinde değişiklik yapıp Commit ettiğinde, sadece lokal repository ‘sinde bu işlemi yapmış olmaktadır.Dolayısıyla kullanıcı network ten ve ana repository den bağımsız şekilde çalışabilmektedir.  Yapılan değişikliklerin ana repository ye yansıtılması için PUSH edilmesi gerekmektedir. Ana repository de oluşan herhangi bir güncellemenin de lokale alınması için tekrar PULL yapılması gerekmektedir.

    Örnek : Git, Bitbucket, SourceTree, Bazaar, Mercurial

Bu yaklaşımlardan herhangi birini henüz hiç kullanmamış iseniz, tanım için verdiğim komut terimleri size belki biraz yabancı gelebilir. Ancak yukarıda anlatmış olduklarımı kullandığınız zaman daha rahat anlayabilirsiniz.

Merkezi-Dağıtık Farkları

Gelelim asıl değinmek istediğim noktaya. Ben çalışma hayatımın ilk dönemlerinde (5 sene falan) hep merkezi yaklaşımdaki sistemler kullanmıştım. Şimdi bir süredir de dağıtık yaklaşımda uygulamalar kullanıyorum. İlk bakışta dağıtık mimarinin daha hızlı olduğu söylense de ben bunu pratikte tam ters olduğunu düşünüyorum şimdilik. Bu belki bilgi ve kullandığım yöntemlerin eksikliğinden belki kurumsal ortamlarda (ana bankacılık kodları) çalışıp çok büyük bir repository ile çalıştığımdan olabilir, bu konuda net bir cevap vermek zor.

Şimdi sözü daha fazla uzatmadan, aralarında gördüğüm farkları bir tablo olarak vermek ve daha görsel hale getirmek istiyorum, sonraki yazılarda görüşmek üzere.

MerkeziDağıtık
Yalnızca çalışacağınız kodları lokalinize alırsınız, dolayısıyla diskte daha az yer kaplama ihtimali yüksektirRepository'nin bir kopyası lokalinize alınmaktadır
Get Latest yada Update ile yalnızca çalışılacak olan dosyanın son hali lokale alınabilirPull yapılarak bütün repository 'nin son hali lokale alınır
Yapılan değişikliği Check In yada Commit yaptığınızda diret ana repository'deki asıl dosya güncellenir, herkes anında son halini alabilirCommit yapıldığında değişiklik yalnızca lokaldeki repository'ye yansımış durumdadır, o anda henüz kimse alamaz, lokaldeki tüm değişikliklerin ana repository'ye gitmesi için Push komutu da kullanılmalıdır
Herhangi bir dosya üzerinde kilitleme yaparak bir başkasının aynı anda üzerinde çalışmasını engelleme yolu açıktır. Gerektiği durumda merge maliyeti daha düşüktür bu sebepleBu seçenek mümkün değildir. Merge sırasında Conflict'lere daha açıktır.
Eğer bağlantı koparsa yapılan değişiklik repository ye gönderilemez, her Check In yada ommit için sürekli online olma ihtiyacı vardır.Repository'nin kopyası zaten lokalde olduğu için yalnızca push işlemi sırasında bağlantıya ihtiyaç bulunmaktadır, bunun dışında commit için tamamen offline çalışılabilmektedir.
Dosya bazlı çalışıldığı için daha hızlı olduğunu söyleyebilirimDeğişiklik olsun olmasın tüm repository üzerinde çalışıldığı için kat kat daha yavaş olduğunu görüyorum. (Her ne kadar tersi olduğu iddia edilse de ben pratikte öyle göremedim)
Daha çok tekil dosyalar üzerine yoğunlaştığı için dosya bazlı geçmişi ve history'nin graph halini göstermede daha başarılı olduklarını söyleyebilirimDağıtık yaklaşımı kullanan tool'larda bu kadar gelişmiş bir dosya bazlı history göremiyorum. (En azından şimdiye kadar kullandığım özellikler olarak)
Tool'lar daha çok ticari ve dolayısıyla ücretli, daha gelişmiş uygulamalarTool'lar daha çok open-source ücretsiz uygulamalar ve nisbeten  daha az gelişmiş özellikleri bulunan uygulamalar

2 thoughts on “Versiyon Yönetim Sistemleri

  1. Ömer Mert Ünal

    Bence güzel bir anlatım , gerekli noktalar bahsedilmiş. Hızlarının farkı konusunda sana katılmıyorum sadece.Teşekkürler.

    1. ademkalin Post author

      Teşekkür ederim. Hız konusunda ters örnekler de olabilir tabi. Hatta, küçük boyutlu projelerde belki tam olarak tersi de olabilir. Ancak ben bu zamana kadar çalıştığım ortamlarda, ortak olduğum modül sayısı ciddi rakamlardaydı, hatta şuan her iki ortamda da çalışıyorum, dağıtık mimaride çok çok yavaş kaldığını net şekilde söyleyebilirim. Burada kullanılan tool un çok etkisi olabilir, bunu da atlamamak lazım. Mesela Eclipse eklentisinden arayüz olarak yeteneklerinin dar olmasına rağmen hızlı çalıştığını anca SourceTree üzerinden çok geniş yetenekler olmasıyla birlikte çok yavaş kaldığını her an görüyor ve saç baş yoluyoruz 🙂

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir