Versiyon Kontrol Sistemi (VCS) Nedir?

Yayınladığım pek çok yazı ve elbette örnekler içerisinde bahsi geçen git ile ilgili çok zamandır bir yazı serisine başlamak istiyordum.

AA

Hazır konu güncelliğe kavuşmuş iken ve zamanı da ıskalamamak adına git öncesinde Versiyon Kontrol Sistemi (VCS) ile yeni ilk adımı atalım.

Versiyon / Sürüm Kontrol Sistemi (VCS / Version Control System)

Öncelikle, versiyon ifadesinin dosyaların kayıt altına alınmış herhangi bir andaki halleri olduğunun altını çizelim. Versiyon veya sürüm kontrolü (aynı zamanda revizyon kontrolü ya da kaynak kontrolü) ise, bir ya da daha fazla dosya üzerinde (metin dosyaları olabileceği gibi görseller, metin ve medya dosyaları, çalıştırılabilir uygulamalar ve dahası) yapılan değişikliklerin (düzenleme, silme, ekleme, isim değiştirme, kopyalama vb.) kayıt ve takip edilmesini ve gerekli bir durumda da belirli işlem noktalarına (versiyonlar / sürümler) geri dönülebilmesini mümkün kılan bir sistemdir1.

Versiyon Kontrol Sistemleri
Best Version Control Systems, g2.com

Kullanım Amacı

Genel olarak yazılım projelerinde tercih edilen versiyon kontrol sistemleri bir kitap yazma2 ya da tasarım süreci3 için de kolaylıkla tercih edilebilir. Örneğin, bir yazar farklı dillerde yayınlanacak kitabı için dallar (branches) oluşturabilir4 ve dilleri farklı dallar ve bu dallar altında sürümler olarak yürütebilir5.

Aynı şekilde bir grafik tasarımcı tasarım programları vasıtasıyla oluşturduğu varyasyonları ve bu varyasyonlardaki değişiklikleri versiyonlar halinde yönetebilir6 7. Böylelikle, versiyonlama sayesinde geniş ekip çalışmalarında veya uzak erişimlerde tasarımcılar / geliştiriciler / yazarlar vb. farklı çözümlemelere odaklanabilirler8. Çünkü versiyonlama / sürümlendirme ile yapılan değişiklikler kolaylıkla karşılaştırabilir, değişiklikler aşamalandırılabilir, yaşanabilecek aksiliklerde (dosya veya içeriğin silinmesi, sürümler arasında geçiş gereksinimi vb.) ise istenen noktaya dosya ya da proje bağlamında geri dönebilirler.

Senkron ve Asenkron Sürüm İşlemleri

Senkron yöntemde, bir kullanıcı dosya üzerinde değişiklik yapmak istediğinde (checkout) sistem dosyaya kilit (locking) koyar. Bu sayede, bir başka kullanıcının aynı dosya üzerinde işlem yapması engellenmiş olur. Dosyayı düzenleyen kullanıcı düzenleme sonunda ya da istediği bir noktada commit işlemini gerçekleştirdiğinde kilit açılır ve dosya diğer kullanıcılar tarafından düzenlenebilir hale gelir. Bu sayede kullanıcılar ve düzenlemeler arasında oluşabilecek çakışmalar (conflict) önlenmiş olur. Ancak, bir kullanıcı işlem yapmak için diğer kullanıcının commit’ini beklemek zorundadır.

Senkron sistemlerdeki kilit mekanizması asenkron sistemlerde kullanılmaz ve bu sayede kullanıcılar aynı dosya üzerinde aynı anda değişiklik yapabilirler. Sistem, değişiklikler commit edildiğinde checkout edilen versiyonla commit edilen versiyonu karşılaştırır ve versiyon farklılığı var ise çakışma oluşur. Son commit’i yapan kullanıcı bu çakışmayı çözerek yeni bir versiyonu commit eder. Kilit mekanizması olmaması kullancıların aynı dosya üzerinde işlem yapmasını mümkün kılsa da sürekli yaşanan çakışmalar süreci aksatabilmektedir.

Farklı Sürüm Kontrol Sistemleri

Elbette ana hatlarıyla açıklamaya çalıştığım Versiyon Kontrol Sistemi (VCS) odaklanılan çözümler temelinde farklı yapıları da barındırmakta.

  • Yerel Sürüm Kontrol Sistemleri (Local Version Control Systems)
  • Merkezi Sürüm Kontrol Sistemleri (Centralized Version Control Systems)
  • Dağıtık Sürüm Kontrol Sistemleri (Distributed Version Control Systems)

Yerel Sürüm Kontrol Sistemleri (Local Version Control Systems)

Bir web uygulaması veya arayüz tasarımı geliştirdiğinizi varsayalım. Dosyaları ve elbette süreç içerisinde ortaya çıkabilecek varyasyonları tutmanın en mantıklı yollarından biri, dosyaları türlerine göre tarih ve sıra bilgisi içerecek şekilde organize etmektir. Bu gibi bir durumda karşılaşılabilecek en yoğun hata yanlış klasörde işlem yapmak olacaktır. Yerel Sürüm Kontrol Sistemleri (Local Version Control Systems) bu anlayış temelinde ortaya çıkmıştır. Yerel Sürüm Kontrol Sistemleri ile dosyalardaki bütün değişiklikleri sürüm kontrolüne alan basit bir veritabanı bulunur.

Sürüm Kontrolü

En yaygın VCS araçlarından biri RCS adıyla hala pek çok bilgisayarda mevcuttur. macOS işletim sisteminde, Developer Tools yüklendiğinde rcs komutu da kullanılabilir hale gelmektedir. Bu sayede, dosyalar arasındaki sürüm farklılıklar özel bir biçimde diske kayıt edilir ve daha sonraki düzenlemelerle birlikte dosyanın belirli bir sürümdeki görünümü yeniden oluşturulur.

Merkezi Sürüm Kontrol Sistemleri (Centralized Version Control Systems)

Geliştirici veya bir tasarım ekibinde, bir proje üzerinde ortak çalışma süreci pek çok sorunu de beraberinde getirmektedir. Bu tür bir çalışma sürecindeki dosyaların kontrolleri için daha geniş ölçekli bir çözüm olarak Merkezi Sürüm Kontrol Sistemleri (Centralized Version Control Systems / CVCS) geliştirilmiştir. Merkezi sistemler uzun yıllar sürüm kontrol sisteminde standart yöntem olarak kabul görmüştür.

CVS, Subversion ve Perforce gibi sistemler Merkezi Sürüm Kontrol Sistemleri için örnek olarak gösterilebilir. Sunucular sürüm kontrolüne alınan bütün dosyaları tutar. Dosyalar bu sunuculardan istemciler vasıtasıyla çekilerek alınırlar (check out).

Merkezi Sürüm Kontrol Sistemleri (Centralized Version Control Systems)

Merkezi Sürüm Kontrol Sistemleri bir önceki sistem olan Yerel Sürüm Kontrol Sistemleri ile kıyaslandığında çok daha fazla avantaj sağlarlar. Örneğin, düzenlemelerden herkes haberdar olur ve sistem yöneticileri ayrıntılı bir şekilde ve kolaylıkla yetkilendirmeleri yönetebilir. Ancak, merkezi sistemin de kendi problemleri mevcuttur. Örneğin, merkezi sunucunun arızalanması durumunda ortaya çıkacak kırılma noktası tüm akışı sekteye uğratabilir. Bu sürede yapılan işlemler sunucuya işlenemeyeceği için sürümler arasında problemler oluşmasına neden olacaktır. Ek olarak, merkezi veritabanı sabit diskindeki bir hasar da eğer yedekleme yapılmamışsa tarihçenin kaybedilmesi anlamına gelebilir.

Dağıtık Sürüm Kontrol Sistemleri (Distributed Version Control Systems)

Dağıtık Sürüm Kontrol Sistemleri (Distributed Version Control Systems / DVCS)’nde istemciler (kullanıcılar) dosyaların yalnızca en son bellek kopyalarını almakla kalmaz, yazılım havuzunu (repository) bütünüyle kopyalarlar. Git, Mercurial, Bazaar ve Darcs gibi örnekleri dağıtık sistemlere örnek olarak ele alabiliriz. Dağıtık sistemlerde üzerinde ortak çalışma yütürülen sunuculardan biri çökerse istemcilerden birinin yazılım havuzu sunucuya geri yüklenerek sistem kurtarılabilmektedir. Her seçip alma (check out) işlemi esasında bütün verinin yedeklenmesiyle sonuçlanır.

Dağıtık Sürüm Kontrol Sistemleri (Distributed Version Control Systems)

Dağıtık sistemlerden çoğu birden çok uzak uçbirimdeki yazılım havuzuyla rahatlıkla ilişkilendirilebilir. Bu sayede, aynı projede farklı geliştiriciler farklı iş akışları üzerinden rahatlıkla çalışabilirler.

Wikipedia, List of version-control software9 başlığı altında alternatif olarak değerlendirilebilecek versiyon kontrol sistemlerini görebilir, Comparison of version-control software10 üzerinden sundukları özellikler çerçevesinde versiyon kontrol sistemlerini karşılaştırabilirsiniz.

Dağıtık Sistemler İle Merkezi Sistemler Karşılaştırması

Dağıtık versiyon kontrol sistemleri (DVCS), merkezi sistemlerin tercih ettiği istemci-sunucu (client-server) yerine sürüm kontrolü için eşler arası (peer-to-peer / P2P) yaklaşımını temel alır. Dağıtık sistem repository (yazılım/dosya havuzu) senkronizasyonunu eş paylaşımı üzerinden pacth’leri değiştirerek gerçekleştirir. Kod tabanının tek bir merkezi sürümü yoktur; bunun yerine, her kullanıcı işleyen bir kopyaya ve tam bir değişiklik geçmişine sahiptir.

Dağıtık sistemlerin (DVCS) merkezi sistemlere (CVCS) kıyasla sundukları avantajları ve dezavantajları şu şekilde listeleyebiliriz11.

  • Network bağlantısı olmasada kullanıcılar ilgili repo üzerinde çalışabilirler,
  • DVCS ortak işlemleri (commits, işlem geçmişinin görüntülenmesi ve değişikliklerin geri alınması gibi) daha hızlı işler, çünkü merkezi bir sunucuyla iletişim kurmaya gerek yoktur. DVCS bu iletişime değişikliklerin diğer ortaklarla (peer) paylaşılacağı zaman ihtiyaç duyar.
  • Özel (private) çalışma alanları oluşturmak mümkündür. Böylece, kullanıcılar paylaşmak istemedikleri taslaklardaki (draft) değişiklikleri de kullanabilirler.
  • Üzerinde çalışılan kopyalar aynı zamanda uzak yedek (remote backup) görevi görürler. Bu sayede herhangi bir donanım hatasından (kırılma noktası gibi) etkilenmezler.
  • Farklı geliştirme modelleri (development branches, commander/kieutenant model gibi) kullanılanibilir.
  • Projenin release version’unun kontrolü merkezi olarak gerçekleştirilebilir.
  • FOSS (Free and Open-source Software / Özgür ve Açık Kaynaklı Yazılım) yazılım projelerinde, liderlik çatışmaları veya tasarımdaki anlaşmazlıklar nedeniyle durdurulmuş bir proje kolaylıkla çatallanarak (fork) sürdürülebilir.

Elbette her şey toz pembe değil. Dağıtık sistemlerin sundukları avantajların yanı sıra bazı dezavantajları da mevcut.

  • Bir repo’nun checkout edilmesi merkezi sistemlere göre daha yavaştır, çünkü tüm dallar (branch) ve revizyon geçmişi varsayılan olarak yerel makineye kopyalanır.
  • Dağıtık sistemlerin, çoğu merkezi sistemin önemli bir parçası olan ve grafik dökümanlar, kompleks binary dosyaları, XML paketleri (ofis dokümanları, PowerBI dosyaları vb.) gibi birleştirilemeyen dosyalar (non-mergeable binary files) için kullanılabilen kilitleme mekanizmalarına (locking mechanism) sahip olmaması önemli bir eksikliktir.
  • Kod tabanı geçmişinin tamamının tam bir kopyası olması demek aynı zamanda her kullanıcı için ek depolama alanı demektir.

Popüler Versiyon Kontrol Sistemleri

Geliştirilen sistemler çerçevesinde kişisel ve/veya kurum ölçeğinde pek çok alternatif değerlendirilebilir ve süreç içerisinde de pazarda yeni oyuncular olacağı ve yeni sistemlerin de geliştirileceği aşikar. Bu anlamda, en azından bugün için referans olması amacıyla aşağıda öne çıkan bazı sistemlere yer vermeye çalıştım12.

CVS Version Control (Concurrent Versions System)

CVS en eski sürüm kontrol sistemlerinden biridir ve hem ticari hem de açık kaynaklı geliştiriciler arasında iyi bilinen bir araçtır. Diğer versiyon kontrol sistemleri (SVN, Git vb.) CVS özellikleri / eksiklikleri temel alınarak geliştirilmişlerdir.

GitHub

GitHub git yapısını kullanan bir platform. Platform olmasının sağladığı avantajlar ve sunduğu ek özellikler çerçevesinde yazılım ekipleri tüm kod değişiklik geçmişini takip edebilmekte, sürümler arasında geçiş yapabilmekte ve paylaşabilmekte. Ek olarak, açık projeler kullanıcılar tarafından fork edilebilmekte, çalışmalara dahil olabilmekte ve repo’ları edinebilmekteler.

GitLab

GitLab, GitHub alternatifi olarak değerlendirilebilir. Ancak, GitHub’a kıyasla daha yeni bir platform olmasına karşın çok daha kapsamlı özellikler sunduğu söylenebilir. Benim de kişisel olarak kullandığım platform GitLab olduğu için yayınladığım yazılarda genel olarak GitLab repolarına denk gelmeniz olası. Ancak, GitHub ile kıyaslandığında popülerlik yarışında daha geriler geldiği söylenebilir.

Mercurial

Mercurial, git yerine kendi yapısını kullanmaktadır ve git‘in öne çıkan alternatiflerinden biri olarak nitelendirilebilir. GitHub ve GitLab’ın sunduğu platform özellikleriyle kıyaslandığında Mercurial’ün ayrıca yapılandırılması gerekir13.

PerForce

Perforce, sürüm kontrolü yeteneklerini HelixCore aracılığıyla sunar. HelixCore, ekip işbirliğini öne çıkaran tek bir platformla birlikte gelir ve hem merkezi hem de dağıtılmış geliştirme iş akışlarını destekler.

Apache Subversion

Apache Subversion, bir diğer açık kaynaklı versiyon kontrol sistemidir ve CollabNet tarafından geliştirilmiştir. Apache Subversion, hem açık kaynak camiasında hem de kurumsal ölçekte pek çok ihtiyaca cevap verebilecek özellikler sunmaktadır.

Beanstalk

Beanstalk, tarayıcı ve cloud temelli yapısı ile remote çalışanlar için değerlendirilebilecek ideal seçeneklerden biri olarak nitelendirilebilir. Tüm işlemler (code, commit, review, deploy vb.) tarayıcı üzerinden gerçekleştirilmektedir. Hem Git hem de SVN’yi destekler ve yerleşik analitik özellikleri ile birlikte gelir.

AWS CodeCommit

AWS CodeCommit, özel Git repolarının yönetiminde kullanılan bir versiyon kontrol sistemidir. Kodlar AWS ortamında barındırılır. Amazon Web Servisleri (AWS) altındaki diğer ürünlerle sorunsuz bir şekilde entegre olur ve bu nedenle özellikle AWS kullanıcıları için değerlendirilmektedir.

Azure DevOps Server

Azure DevOps Server, eski adı ile Microsoft Team Foundation Server (TFS), Microsoft tarafından geliştirilen ve diğer Microsoft ve Azura ürünleri ile kolaylıkla entegre olabilen bir versiyon kontrol sistemidir. Özellikle kurumsal ölçekteki ihtiyaçlara yönelik çözümler sunar. Azure DevOps (VSTS) cloud temelli çözümlere sahipken, Azure DevOps Server (TFS) kişisel barındırma özellikleri ile öne çıkar.

Bitbucket

Bitbucket, git temelli bir versiyon kontrol sistemidir. Atlassian yazılım paketinin bir parçasıdır ve bu sayede HipChat, Jira ve Bamboo gibi diğer Atlassian servisleri ile kolayca entegre edilebilir.

İleri Okumalar

  1. Source Control HOWTO
  2. A Visual Guide to Version Control
  3. Ali Özgür, “Git 101” (2017)
  4. Dağıtık Versiyon Kontrol Sistemleri
  5. Versiyon kontrol sistemlerine gerek var mı?
  6. Versiyon Kontrol Sistemleri (VCS)
  7. Not Just For Coders: Top Version Control Systems For Writers
  8. Github for Writers
  9. Flashbake Automates Version Control for (Nerdy) Writers
  10. Git for writers: Write fiction like a (good) programmer
  11. The Ultimate Guide to Version Control for Designers
  12. Git and Mercurial commands
  13. Mercurial for Git users
  14. The Best Version Control System (3 Reasons Why It Matters to All ColdFusion Developers)
  15. 2019 Version Control Software Comparison: SVN, Git, Mercurial