Git Akışı - Çoklu Versiyon Desteği

Projelerin ölçeği büyüdükçe ve içinde çalışan insan sayısı arttıkça, kod geliştirme sürecinde büyük değişiklikler meydana geliyor. Tecrübelendikçe kodu yazmanın, geliştirme süreci içerisinde çok küçük bir yer kapladığını her geçen gün daha bi fazla anlıyorum. Bu konu da tam olarak bunlardan bir tanesi.

Yapılacak değişiklikler desteği devam edilen tüm versiyonları kullanan kullanıcılar gözetilerek gerçekleştirilmelidir. Bu bağlamda en güncel sürüm geliştirme aşamasında iken, geçmiş sürümlere de desteğin devam etmesi gerekebilir. Bu durum haliyle git'i kullanma yönetmimizi de değiştiriyor.

Varsayalım ki bir proje geliştiriyorsunuz ve 1.0.0 sürümünü çıkarttınız. Geliştirmeleriniz sürüyor ve 1.5.0'a kadar geldiniz. Değişiklikleriniz çok büyük etkiler yaratmıyor. Ancak bir yandan da büyük kapsamlı değişiklikler de planlıyor ve paralelde geliştiriyorsunuz. Bu büyük değişikler ile birlikte projenizin(ürün veya kütüphane) sunduğu API büyük değişikliklere uğruyor hatta bazıları siliniyor. Haliyle bu etkisi büyük olan değişiklikleri major olarak değerlendirip major versiyonu arttırarak yapıyorsunuz; yani 2.0.0'da. Zamanı geldi ve 2.0.0 sürümünü de çıkarttınız. Ancak 1 versiyonunu kullanan o kadar fazla kullanıcınız var ki, desteği sürdürmeye devam etmeniz gerekiyor. Python kullananlar bilecektir; bu durum belirgin bir şekilde mevcut.

Peki böyle bir durumda git akışımız nasıl ilerlemeli; Başlangıçta sadece 1.x.x sürümümüz mevcutken varsayılan master ve dev branchlerinde geliştirmelerimizi yapıyoruz oluruz. Neden dev branchine ihtiyacımız var sorusunun cevabını Why do we need dev branch? yazısında bulabilirsiniz. Artık 2.x.x versiyonuna başlıyoruz. Bu noktada 1.x.x adında branch açıp yollarımızı 1.x.x versiyonu ile ayırıyoruz. Ayırmak demek master ile bir daha yollarının kesişmeyeceği anlamına geliyor. En güncel halini master ve dev branchlerinden sürdürmeye devam ederken bir yandan da 1.x.x sümünü 1.x.x branch inde desteklemeye devam edebiliriz. Eğer 3.x.x sürümüne başlanmış ise aynı şey tekrardan bu sefer 2.x.x için yapılmalı. Bu döngü böyle devam ediyor

Single Version Support

Two Versions Support

Three Versions Support

Varsayalım ki birden fazla major versiyonu etkileyen bir bug ile karşılaştık. Bu durumda ise bunu bugfix-bug-definititon yeni branchi altında çözdükten sonra(feature branchlerde de çözülebilir), etkilenen versiyonların branchlerine ayrı ayrı merge edilebilir.

Not: Sürümlemek için branch yerine tag'ler kullanılmalı. Bir sürüm çıktıktan sonra bir değşikliğe uğramamalı. Tag'ler immutable olmaları sebebiyle seçimi yapıyorum. (Elbette ki tag'ler de silinip tekrar oluşturulabilir ancak en azından yanlışlıkla güncellenemez.).