Konu Anlatımı
Sürüm Kontrolü ve Kod Paylaşımı
Bir proje uygulaması tek kişinin değil, çoğu zaman bir ekibin eseridir. Ekipte herkes aynı dosya üzerinde çalıştığında, hangi değişikliğin kim tarafından ve ne zaman yapıldığı takip edilemez hâle gelir. Bu sorunu çözen araç sürüm kontrol sistemidir. Sürüm kontrolü, kodun her değişikliğini ayrı bir kayıt olarak saklar; böylece geçmişe dönülebilir, kim neyi değiştirdi görülebilir ve birden çok kişi aynı proje üzerinde güvenle çalışabilir.
Bu derste ne öğreneceğiz?
Bu konuda önce sürüm kontrol sisteminin temel kavramlarını ve proje tasarımı aşamasında neden kullanıldığını öğreneceğiz. Bir değişikliği hazırlık alanına alıp kalıcı kayda çevirme adımlarını uygulayacağız. Dallar yardımıyla aynı projede birden çok işin paralel yürütülmesini göreceğiz. Dalları birleştirirken ortaya çıkan çakışmayı nasıl çözeceğimizi inceleyeceğiz. Son olarak sürüm numaralandırmasını ve ekip çalışması kurallarını öğreneceğiz.
1. Ön bilgi: neden sürüm kontrolü gerekir
Sürüm kontrolü olmayan projelerde en sık karşılaşılan sonuç, çalışan bir programın bozulmasıdır. Bir denemede yapılan değişiklik geri alınamadığında, saatlerce süren emek kaybolur. Klasör kopyalama yöntemi de güvenilir değildir; çünkü hangi kopyanın doğru olduğu belirsizleşir ve kopya sayısı çoğaldıkça karışıklık artar.
Sürüm kontrolü durum kavramını da netleştirir: kaydedilmiş, kaydedilmemiş ve geçici olarak hazırlanan durumlar ayrı ayrı bilinir. Bir programı denemekten çekinmeden değişiklik yapabilirsiniz; beğenmediyseniz tek komutla önceki kayda dönebilirsiniz. Bu özgürlük, deney yapmayı teşvik eder ve bu nedenle sürüm kontrolü yalnız bir arac değil, çalışma alışkanlığıdır.
2. Değişiklik kaydının oluşturulması
Sürüm kontrolünde üç aşamalı bir akış vardır. Birinci aşamada dosya çalışma ağacında bulunur; bu henüz kaydedilmemiş durumdur. İkinci aşamada değiştirilmiş dosyalar hazırlık alanına alınır; bu alan, bir sonraki kayda girmeyi bekleyen değişiklikleri tutar. Üçüncü aşamada kayıt oluşturulur ve değişiklik kalıcı geçmişe yazılır.
Kayıt mesajı yazmak yüzeysel görünse de önemlidir. Mesaj, ne yapıldığını tek cümlede ve emir kipinde anlatmalıdır. Örneğin bir sınıfın adı değiştirildiyse mesaj yalnız değişiklik konusunu belirtmeli, ayrıntıyı commit içine gömmelidir. Birbiriyle ilişkisiz iki değişikliği aynı kayda koymak, sonradan geri almak istediğinizde işi zorlaştırır.
3. Kayıt kimliği ve geçmişin izlenmesi
Her kayda, içeriğinden hesaplanan bir kimlik verilir. Bu kimlik kırk karakter uzunluğunda onaltılık bir karakter dizisidir ve içerik değişirse tamamen farklı bir değere dönüşür. Bu nedenle kayıt kimliği, içeriğin değiştirilmediğini göstermek için kullanılabilen bir parmak izidir.
Geçmiş sıralı bir liste hâlinde tutulur. git log komutu bu listeyi en yeni kayıttan başlayarak ekrana basar ve her satırda kimlik, tarih ve mesaj yer alır. İki kaydın kimliği aynıysa içerikleri de aynıdır. Bu özellik, kodun kopyalandığı yerlerde hangi sürümün daha yeni olduğunu anlamak için de kullanılır.
4. Dallar ve paralel çalışma
Dallar, sürüm kontrolünün en güçlü araçlarından biridir. Dal, kayıt çizgisinin bir dalıdır; açtığınızda ana çizgi olduğu gibi kalır ve siz bu yeni çizgi üzerinde çalışmaya başlarsınız. Bu sayede ana çizgideki kararlı sürüm bozulmaz.
Yeni bir özellik üzerinde çalışacaksanız kendi dalınızı açarsınız. Bu dal tamamlanıp denendiğinde ana çizgiye birleştirilir. Ekipte birden çok kişi aynı anda farklı özellikler üzerinde çalışabilir; herkes kendi dalındadır ve ana çizgiye yalnız hazır işler birleştirilir. Bu düzen, ana çizgideki programın sürekli çalışır durumda kalmasını sağlar.
5. Birleştirme ve çakışma çözümü
Bir dalda yapılan iş tamamlandığında birleştirme yapılır. Birleştirme çoğu zaman sorunsuzdur; ancak iki dal aynı satırları değiştirmişse sistem karar veremez ve çakışma bildirir. Çakışmada aynı satırlar iki farklı hâlde işaretlenir ve dosya özel bir duruma geçer.
Çakışma çözümü üç adımda yapılır: dosya elle açılıp doğru içerik yazılır, dosya hazırlık alanına alınır ve birleştirme kaydı oluşturulur. Çakışmayı çözmeden yeni kayıt açmak yasaktır; aksi hâlde çözülmemiş dosya sonraki birleştirmeleri de etkiler. Ekipte hangi tarafın seçileceği konusunda önceden bir kural belirlenmesi, çakışmaların hızla çözülmesini sağlar.
6. Sürüm numaralandırması
Publik edilen her sürüm bir numarayla etiketlenir. Numara üç bölümden oluşur ve bölümlerin anlamı bellidir. En büyük bölüm, uyumsuz değişikliklerde artar. Ortadaki bölüm, geriye uyumlu olarak yeni özellik eklendiğinde artar. En küçük bölüm ise yalnız hata düzeltmesi yapıldığında artar.
Bu ayrım kullanıcıya ne bekleyeceğini söyler. En küçük bölümün artması güvenlidir; orta bölümün artması yeni özellik anlamına gelir; en büyük bölümün artması ise eski kayıtların çalışmayabileceği anlamına gelir. Yanlış bölüm artırılırsa kullanıcı yanlış beklentiye girer ve güncelleme sırasında sorun yaşar.
7. Değişikliği geri alma
Bir hatalı kaydı geri almak için iki farklı yol vardır. Geri alma kaydı yöntemi, hatalı değişikliği etkisiz hâle getiren yeni bir kayıt oluşturur; geçmiş korunur, hatalı kayıt durur ama etkisizdir. Tarihi sıfırlama yöntemi ise geçmişten kayıtları siler. Tarihi sıfırlama geçmişi bozduğu için yalnız kendi dalınızda ve paylaşılmamış kayıtlarda kullanılmalıdır.
Ekip çalışmasında geri alma kaydı tercih edilir; çünkü herkes aynı geçmişi görür ve kimsenin kaydı kaybolmaz. Geri alma işlemi de bir kayıttır, bu nedenle kendi mesajıyla kaydedilir ve denetlenebilir.
8. Takip dışı bırakma kuralları
Derleme çıktıları, geçici dosyalar ve kişisel ayar dosyaları kayıt altına alınmamalıdır. Bu dosyaların Takip dışı bırakma listesine eklenmesi, ilk kayıttan önce kurulması gereken en önemli adımlardan biridir. Aksi hâlde bu dosyalar da kayıt altına girer ve çalışma ağacı kirlenir.
Takip dışı bırakma, ileride takip edilmesi gereken bir dosyayı da dışlayabilir. Bu yüzden bu liste dikkatli hazırlanmalı ve ekip içinde ortak bir dosyada tutulmalıdır. Ortak liste, herkesin aynı kurallara uymasını sağlar ve neden bazı dosyaların kaydedilmediği sorusu her seferinde yeniden sorulmaz.
Basit örnek
Bir öğrenci beş gün boyunca her gün üç kayıt oluşturmuştur. Toplam kayıt sayısı 5 × 3 = 15 olur. Bu öğrenci 15 kayıttan 5'ini geri almak isterse geriye 15 − 5 = 10 kayıt kalır. Ancak geri alma işlemi kayıt geçmişini silmez; onun yerine 10 kayıtlık etkin geçmiş elde edilir ve 5 geri alma kaydı görünür kalır.
İleri örnek
Bir ekip projesinde ana dalda 2 kayıt varken A dalında 8, B dalında 5 kayıt yapılmıştır. İki dal da tamamlanıp ana dala birleştirildiğinde ana daldaki toplam kayıt sayısı 8 + 5 + 2 = 15 olur. Bu hesap, ekibin hangi dalda ne kadar çalıştığını gösterir. A dalındaki özellik ana üründe kullanıcılara yansırken B dalındaki hata düzeltmesi hiç görünmeyebilir; bu nedenle dal adları anlamlı seçilmelidir.
Adım adım çözülmüş örnek
Soru: Bu depoda 30 dosya bulunmaktadır. Takip dışı bırakma listesinde 12 dosya yer alıyor. Depoda kaç dosya kayıt altındadır?
Adım 1: Depodaki toplam dosya sayısı belirlenir: 30. Adım 2: Takip dışı bırakılan dosya sayısı belirlenir: 12. Adım 3: Toplam dosyadan dışlananlar çıkarılır: 30 − 12 = 18. Adım 4: Sonuç yorumlanır; 18 dosyanın kayıt altında olduğu ve bu sayının küçük tutulmasının depo temizliğini göstergesi olduğu yazılır. Cevap: 18 dosya kayıt altındadır.
Kavram karşılaştırma tablosu
| Kavram | Anlamı | Örnek |
|---|
| Çalışma ağacı | Henüz kaydedilmemiş dosyalar | Kaydedilmemiş kaynak dosyası |
| Hazırlık alanı | Bir sonraki kayda girecek değişiklikler | Sahiplenilen dosyalar |
| Kayıt | Kalıcı geçmişe yazılan değişiklik | Özellik tamamlandı |
| Dal | Kayıt çizgisinin kolu | Özellik dalı |
| Birleştirme | Dalı ana çizgiye katma | Hata düzeltmesi eklenmesi |
| Çakışma | Aynı satırların iki kez değişmesi | İki kişi aynı satırı düzenledi |
| Geri alma kaydı | Etkisi kaldırılan yeni kayıt | Hatalı ekran düzeltmesi |
| Takip dışı liste | Kaydedilmeyecek dosyalar | Derleme çıktıları |
Sık Yapılan Hatalar
- Hazırlık alanına almayı atlama: Hazırlık alanına girmeyen bir değişiklik kayda girmez ve sessizce unutulur. Değiştirilen her dosya hazırlık alanına alınmalıdır.
- Ana dalda doğrudan çalışma: Ana dalı kararlı tutmak, özellikleri kendi dallarında geliştirmekle sağlanır. Ana dalda yapılan deney, tüm ekibin çalışma bütünlüğünü bozabilir.
- Takip dışı listeyi sonradan kurmak: Derleme çıktıları ilk kayıttan önce dışlanmazsa depoya karışır ve ayıklama zorlaşır.
- Çakışmayı çözmeden devam etmek: Çözülmemiş dosya sonraki birleştirmeleri de etkiler ve hatanın ileride çıkmasına yol açar.
- Her şeyi tek kayda koymak: İlişkisiz değişiklikleri birleştirmek, geri almak istediğinizde ayrım yapmayı zorlaştırır. Kayıt küçük ve tek konulu olmalıdır.
- Tarihi sıfırlamayı ana dalda kullanmak: Bu işlem geçmişi bozar ve ekibin diğer üyelerinde sorun çıkarır; yalnız kendi dalınızda kullanılmalıdır.
Özet
Sürüm kontrolü, kod değişikliklerini ayrı kayıtlar hâlinde saklayarak geçmişe dönüşü ve ekip çalışmasını mümkün kılar. Bir değişiklik üç aşamadan geçer: çalışma ağacı, hazırlık alanı ve kayıt. Her kayda kırk karakterlik bir kimlik verilir ve bu kimlik içerik değişirse tamamen değişir. Dallar kayıt çizgisinin koludur; özellikler kendi dallarında geliştirilip tamamlandığında ana çizgiye birleştirilir. İki dal aynı satırları değiştirdiyse çakışma oluşur ve dosya elle düzeltilip yeniden hazırlık alanına alınarak çözülür. Sürüm numarasının üç bölümü sırasıyla uyumsuz değişiklik, yeni özellik ve hata düzeltmesini anlatır. Hatalı kayıt için geri alma kaydı oluşturmak geçmişi korurken, tarihi sıfırlama geçmişi bozar ve yalnız paylaşılmamış dallarda kullanılmalıdır. Derleme çıktıları gibi dosyalar takip dışı bırakma listesiyle ilk kayıttan önce dışlanmalıdır; 30 dosyadan 12'si dışlandığında 30 − 12 = 18 dosya kayıt altında kalır.
Kendini dene
Şu soruları cevaplayarak konuyu pekiştir: (1) Yeni bir özellik üzerinde çalışacaksınız; hangi adımlarla ilerleyeceğinizi ve hangi komutları kullanacağınızı yazınız. (2) İki kişi aynı dosyanın aynı üç satırını değiştirdiğinde ne olur ve nasıl çözülür? (3) Sürüm numarası 1.6.0 iken 1.6.1 ve 2.0.0 çıkmışsa bu değişikliklerin anlamını açıklayınız. Cevaplarınızı adım adım yazın; puana göre değerlendirmede adım sırası, komut seçimi, çakışma çözümü ve sürüm numarası yorumu ayrı ayrı değerlendirilir.