Versiyon Kontrol Sistemleri
Versiyon Kontrol Sistemleri (VCS), yazılım geliştirme süreçlerinde yoğun olarak kullanılan sistemlerdir. Bu sistemler, dosyalar/kodlar üzerindeki değişiklikleri takip etmek, sürüm geçmişlerini yönetmek ve aynı dosya üzerinde farklı kişilerin birlikte çalışmasına olanak sağlamaktadır. VCS, bir projenin farklı versiyonlarının tutulması, değişikliklerin izlenmesi ve yönetilmesini sağlayan bir sistemdir.
Versiyon Kontrol Sisteminin en temel işlemlerinden biri, projedeki dosyaları versiyonlu olarak saklamak ve istenilen önceki versiyonlara dönüş sağlamaktır. Bunun sağladığı en büyük yarar, aynı proje ve dosya üzerinde aynı anda birden fazla geliştiricinin çalışmasına olanak sağlamaktır. Bunlara ek olarak, versiyon kontrol sistemleri yapılan değişikliklerin kim tarafından, ne zaman yapıldığını ve diğer tüm ayrıntıları kaydederek projenin geçmişinin izlenmesini sağlar.
Günümüzde en popüler dağıtık versiyon kontrol sistemlerinden bir tanesi Git’tir. Git, küçük projelerden kurumsal ölçekli büyük projelere kadar birçok projede kullanılmaktadır. Git dışında popüler olan diğer versiyon kontrol sistemleri arasında Subversion (SVN), Concurrent Versions System (CVS) ve Mercurial bulunmaktadır.
Versiyon Kontrol Sistem Türleri
Sektörde birçok versiyon kontrol sistemi bulunmaktadır. Bunları yapılarına göre sınıflandırmak gerekirse üç farklı türden bahsedebiliriz:
- Yerel Versiyon Kontrol Sistemi
- Merkezi Versiyon Kontrol Sistemi
- Dağıtık Versiyon Kontrol Sistemi
Yerel Versiyon Kontrol Sistemleri
Yerel Versiyon Kontrol Sistemleri (LVCS), bir yazılım projesindeki değişiklikleri yerel bilgisayar düzeyinde yönetmek için kullanılan yapılar olarak kullanılır. LVCS, projedeki değişikliklerin saklanması, değişiklik geçmişinin izlenmesi ve istendiğinde önceki versiyonlara dönülmesine imkan sağlar. Ancak tüm bunları sadece tek bir kullanıcı veya bilgisayar düzeyinde yapar. İşbirliği yapmamıza imkan vermez.
Yerel versiyon kontrol sistemleri genellikle küçük ölçekli veya bireysel olarak çalışılan projelerde tercih edilir. Örneğin, bir yazılım geliştirici, sadece kendi üzerinde çalıştığı küçük ölçekli bir projede yerel versiyon kontrol sistemlerini tercih edebilir. Yerel versiyon kontrol sistemleri, temel anlamda versiyon kontrol sistemlerinin sunduğu değişiklik izleme, geri alma veya geçmiş bir versiyona dönme gibi özellikleri sunar.
Şekil 1’de mimarı yapısı bulunan yerel kontrol sistemleri internet altyapısının gelişmediği, yazılım projelerinin günümüze göre daha küçük olduğu yazılım sektörünün ilk dönemlerinde LVCS yaygın olarak kullanılmışlardır. Ancak günümüz ihtiyaçlarına cevap veremedikleri için tercih edilmemektedirler. En yaygın yerel versiyon kontrol sistemlerine örnek olarak Revision Control System (RCS) verilebilir. Diğer önemli yerel versiyon kontrol sistemleri ise Concurrent Versions System (CVS) ve Source Code Control System (SCCS) olarak sıralanabilir.
Merkezi Versiyon Kontrol Sistemleri
Merkezi Versiyon Kontrol Sistemleri , yerel versiyon kontrol sisteminin yetersiz kaldığı noktaların giderilmesi için geliştirilen merkezi bir versiyon kontrol sistemidir. Bu sistemde tüm değişiklikler ve dosyalar yerel bir istem yerine merkezi bir sistem üzerinde tutulurlar. Kullanıcılar dosyaları merkezi sunucudan alır, üzerinde değişiklik yapar ve tekrar sunucuya gönderirler.
Merkezi VCS’leri, merkezde bulunan bir sunucu üzerine inşa edilen bir yapıdır. Bu sunucu, projenin ana depolama alanıdır ve tüm dosyaların versiyon geçmişlerini ve değişikliklerini tutar. Kullanıcılar, geliştirmelerine başlamadan önce sunucudan dosyalarını indirerek (update) yerel ortamlarında çalışırlar. Çalışmalarını tamamladıktan sonra dosyayı sunucuya gönderirler (commit). Bu şekilde aynı proje üzerinde aynı anda birden fazla geliştiricinin çalışmasına imkan sağlanmış olur.
Şekil 2’de bulunan mimarı yapısı nedeniyle merkezi versiyon kontrol sistemlerinde, tüm kod tabanının tek bir merkezi sunucuda bulunması, bu sunucunun arızalanması veya veri kaybı yaşanması durumunda ciddi riskler taşıyabilir. Böyle bir durumda, projenin geçmiş versiyonları, değişiklik geçmişleri ve diğer önemli veriler kaybolabilir, bu da projenin bütünlüğünü ve ilerlemesini olumsuz etkileyebilir.
Team Foundation Server (TFS), merkezi versiyon kontrol sistemlerinden bir tanesidir. Örnekleri artırırsak, bunlara Subversion (SVN) ve Perforce da ekleyebiliriz. Yerel versiyon kontrol sistemlerinin aksine, günümüzde hala birçok projede kullanılmaktadırlar.
Dağıtık Versiyon Kontrol Sistemleri (Distributed Version Control System)
Dağıtık Versiyon Kontrol Sistemleri (DVCS), versiyon kontrol sistemlerinin en gelişmiş ve günümüzde yaygın olarak kullanılan türüdür. Bu sistemler Merkezi VCS’lerden farklı olarak birçok ek yapıyı içerir, örneğin Yere repository (yerel depo). Her kullanıcı (geliştirici) kendi yerel repository’sine sahiptir. Ayrıca, Merkezi VCS’de olduğu gibi merkezi bir sunucuda bulunan Remote Repository yapısı da bulunur. Aşağıda Şekil 3’te genel mimari yapısı bulunmaktadır.
DVCS’lerinde her kullanıcı, projenin tam bir kopyasını yerel bir depoda (repository) saklar. Bu depo, geliştiricinin yerel bilgisayarında bulunur. Yerel depoda (Yere repository), tüm projenin değişiklik ve versiyon geçmişi bulunur. Yazılımcı, yerel depo üzerinden değişiklik ve geliştirmelerini yaparak yeni sürümler oluşturur. Yapılan bu değişiklikler yerel depolama alanına kaydedilir. Ardından diğer kullanıcılarla paylaşılmak üzere Merkezi Depo (Remote Repository) ile senkronize edilir.
En popüler DVCS sistemlerinden biri Git’tir. Git, hızlı, esnek ve geniş bir kullanıcı kitlesine sahiptir. Git’e ek olarak Mercurial ve Bazaar da örnek olarak verilebilir.
Git
Git, bir dağıtık versiyon kontrol sistemidir (DVCS). Yazılım geliştirme süreçlerinde kullanılır ve Linus Torvalds tarafından Linux çekirdek geliştirme sürecinde karşılaşılan sorunlara çözüm olarak geliştirilmiştir. Git, hızlı, esnek ve gelişmiş özelliklere sahip popüler bir versiyon kontrol sistemidir.
Git, dosyalar üzerindeki değişiklikleri izleyen ve yöneten bir dağıtık versiyon kontrol sistemidir. Yazılım geliştirme sürecinde bazen işler ters gidebilir ve kodumuzun bir önceki haline dönmek veya bir önceki haliyle mevcut halini karşılaştırmak gibi ihtiyaçlarla karşılaşabiliriz. Git, bu gibi çeşitli ihtiyaçlara çözümler sunar.
Şekil 4’te görülen yapısal düzen, Git’in geliştiricilere bir dizi avantaj sunmasına olanak tanımıştır. Geliştiriciler, yerel bilgisayarlarında bulunan bir Git deposunu (repository) kullanarak proje dosyalarını tutarlar ve değişiklikleri takip ederler. Bu, geliştiricilere çevrimdışı çalışma imkanı sağlar ve paralel geliştirme yapmayı kolaylaştırır.
Stash
Stash, bir rah/saklama alanı olarak ifade edilebilir. Örnek üzerinden açıklamak gerekirse, geliştirici müşteri listeleme işi (task) için çalışmaya başlar ve belirli bir noktaya gelir. İşini bitirmeden daha acil olan ödeme servisinde yaşanan bir problemle ilgili bir bug kaydı açılır. Müşteri listeleme işi için yaptığı tüm değişiklikleri bir kenara kaldırarak, ödeme servisi problemini çözmek için çalışmaya başlaması gerekebilir. Yaptığı değişiklikleri stash’e atarak (git stash), projenin son güncel halinde çalışmaya başlayabilir.
Workspace
En basit ve anlaşılır haliyle geliştiricinin çalıştığı yerel bilgisayarında bulunan klasörü ifade eder.
Index
Bir dosyanın Git tarafından izlenmesi ve değişikliklerin saklanması için indexlenmesi gerekir, yani Git’e bu dosyanın artık versiyon kontrol sistemine dahil edildiği bildirilir. Index yapısıyla istenilen dosyalar versiyon kontrol sistemi dışında tutulabilir. Örneğin, React projesinde çalışan bir geliştiricinin “node_modules” klasörünü versiyon kontrol sistemine dahil etmemesi gerekebilir.
Yere Repository (Yerel Depo)
Projenin tüm dosyaları, geçmiş versiyonları ve diğer bilgilerin tutulduğu Remote Repository (Merkezi Depo)’nin bir kopyasıdır. Bu depolama alanı, geliştiricinin çevrimdışı çalışmasına olanak sağlar.
Remote Repository (Merkezi Depo)
Projenin tüm dosyalarının merkezi bir sunucu üzerinde tutulduğu depolama alanıdır. Bu, aynı projede çalışan birden fazla geliştiricinin birlikte çalışmasına olanak sağlar.
Git’in bazı önemli özellikleri şunlardır:
- Hız ve verimlilik: Git, hızlı ve verimli bir versiyon kontrol sistemidir. Bu, tercih edilme nedenlerinden biridir.
- Dağıtık çalışma(Distributed) : Her geliştiricinin kendi yerel deposu (Yere repository) olması, çevrimdışı çalışma ve paralel geliştirme yapabilme imkanı sağlar.
- Dal(brach) desteği: Git, projeyi farklı dallara (branches) ayırarak aynı anda farklı özellikler üzerinde çalışmayı mümkün kılar. Örneğin, iki geliştirici customer_branch üzerinden müşteri modülünü geliştirirken, aynı anda üç geliştirici de order_branch üzerinden sipariş modülünü geliştirebilir.
- Merge(birleştirme): Git, farklı dallar üzerinden geliştirme yapmayı destekler. Branch’ler arasındaki senkronizasyon ve birleştirme için gelişmiş merge araçları sunar.
- Esneklik : Git, birçok yazılım geliştirme modelini destekler ve küçük projelerden büyük projelere kadar hepsinde etkili bir şekilde kullanılabilir.
Git, sunduğu özellikler ve kolay kullanımı sayesinde geniş bir kullanıcı kitlesine sahiptir. Şekil 5’te, 2022 yılında Stack Overflow platformu tarafından yapılan ve 71,379 geliştiricinin katıldığı anket sonuçları vardır. Git, %93.87’lik bir oranla ilk sırada yer almaktadır.
Sonuç olarak, diğer versiyon kontrol sistemlerine ile yapılan karşılaştırma da avantajlarının şekil 6 görüldüğü üzere dağıtık versiyon kontrol sistemleri modern yazılım geliştirme süreçlerinin vazgeçilmez bir parçasıdır. Paralel çalışma, esneklik, güçlü işbirliği olanakları, veri koruması, uzaktan işbirliği, tarih izleme ve kollaboratif kod incelemeleri gibi avantajlarıyla projelerin daha organize, güvenilir ve etkili bir şekilde yönetilmesine olanak tanır.
Kaynaklar:
- https://survey.stackoverflow.co/2022/#version-control-version-control-system (20.06.2023)
- https://git-scm.com/ (20.06.2023)
- https://www.gnu.org/software/rcs/manual/ (20.06.2023)
- https://www.atlassian.com/git/tutorials/what-is-version-control (20.06.2023)
- https://about.gitlab.com/topics/version-control/ (20.06.2023)
- https://subversion.apache.org/ (20.06.2023)
- https://www.nongnu.org/cvs/ (20.06.2023)
- https://www.mercurial-scm.org/ (20.06.2023)
- https://learn.microsoft.com/en-us/azure/devops/repos/tfvc/what-is-tfvc?view=azure-devops (20.06.2023)