Bu yazı içeriğinde bir yazılım geliştirirken kullandığımız git aracı ile projemizin kod sürümlerini, kalitesini yönetirken kullabileceğimiz iş akışı taslaklarını anlatmaya çalışacağım.
- Centralized Workflow
- Feature Branch Workflow
- Gitflow Workflow
- Forking Workflow
Centralized Workflow
Bu iş akışı şemasında bir tane merkezi dal (branch) mevcuttur.
Versiyon kontrol sistemlerinden
svn (subversion) sisteminde trunk,
git üzerinde master olarak bu dal adlandırılıyor.
Bu iş akışında svn üzerinde yaptığınız geliştirmeleri git üzerinde de yapabilirsiniz.
Fakat git , svn e ek olarak bir çok güzel özelliğe sahiptir.
Ilk olarak git, merkezdeki kodun bir kopyasını tüm geliştiricilerin kendi bilgisayarlarında tutma imkanı sağlar.
Projedeki tüm değişiklikler birbirinden bağımsız ilerleyebilir.Her yerel depo yani bilgisayarınızdaki kopya üzerinde yaptığınız değişiklikler sadece sizin yerel deponuz üzerinde değişikliğe uğrayarak istenildiğinde merkezdeki depoya yaptığınız değişlikler gönderilerek eklenir.
Ikinci olarak git, Güçlü bir dal(branch) ve birleştirme (merge) alt yapısı sağlar.
svn den farklı olarak git dalları tasarlanırken kodları birleştirmek ve depolar arası
farklılıkları eşitlemek için hata-güven mekanizmasına dikkat edilerek tasarlanmıştır.
Bu iş akışında diğer iş akışları ile ortak özellik olarak,
merkezi bir sunucudaki depodan kod alınır, değişiklikler yapıldıktan sonra tekrar merkezi depoya gönderilir.
Fakat diğer iş akışları ile karşılaştırdığımızda merkezi iş akışında,
kopyalama (forking) veya kodun bir kopyasını alıp farklı bir kullanıcı kendi geliştirmelerini yapıp sizin elinizdeki kod ile karşılaştırılmasını isteyebileceği bir
özelliği (pull request) yoktur.
How it works?
Ali uzak sunucudaki merkez kodu bilgisayarına alır ve değişikliklerini yapar.
Merkez depoda ne olduğu ile ilgilenmez.
Veli nin de Ali gibi kendine ait geliştirmeleri yaptığını düşünelim.
Ali kendi işini Veli den önce bitirdi ve merkez kod(master) üzerindeki değişikliklerini diğer takım çalışanları ile paylaşabilmek için merkez depoya gönderdi. Ali ilk olarak gönderdiği ve o zaman dilimine kadar kimse uzak sunucudaki merkez kod(master) uzerinde değişiklik yapmadığı için Ali nin değişiklikleri kolayca merkezdeki kod ile birleşerek artık merkez kod son halinde yani Ali nin yaptığı değişiklikleri de barındıracak hale gelir.
Veli kodunu merkez depoya göndermeye çalışsın.Sonuç olarak hata alacaktır.
Alınan hata uzak sunucudaki merkezi kod, yerel bilgisayarındakinden daha farklı ve yeni değişiklikler olduğu için kod gönderilemeyecektir.
Hata bizlere, önce uzaktaki sunucudaki kodun son halini yerel deponuza çekmeyi
ardından ilgili hatalar(conflict) varsa düzelttikten sonra gönderebileceğimizi söyler.
Bunun yerine aşağıdaki durum tercihte edilebilir.
Veli merkezi depodan kodu ne zaman almış ise o tarihten itibaren başlayarak günümüze kadar olan değişiklikleri merkezde geçici bir yerde tutup (rebase), Veli kendi değişikliklerini merkez koda ekler.
Daha sonra geçici yerde tutulan kodlar merkez koda eklenerek değişiklik işlemi tamamlanmış olur. Varsa hataları Veli yine çözmelidir.
Bu iş akışı için her zaman ikinci yöndem daha uygundur.
Çünkü birincide kodu birleştirme değişikliğini (merge commit) bir noktada sonuçlandırırsınız fakat ikincide her değişiklik için tek tek karşılaştırılma yapıldığından problem varsa sadece o adım içindeki problem çözülerek sonraki değişikliklere geçilerek ilerlenebilmektedir.
Temiz bir proje geçmişimiz olursa, istediğimiz noktayı da geriye doğru değiştirebiliriz. 🙂
Feature Branch Workflow
Bu iş akışının arkasında yatan temel fikir ;
Tüm geliştirmeler, merkezdeki ana dal (master branch) yerine
her özellik için ayrı bir dal(branch) oluşturularak
birbirinden ve merkez koddan bağımsız ortam sağlanarak yapılır.
Bu yapı sürekli entegrasyon ortamlarını(continuous integration) kullanıyor iseniz
ana dal üzerinde problemli kod oluşmayacağı, her özelliğin ana dal tarafına eklenirken
tek tek incelenerek geliştirmeler aktarıldığı için güzel bir alt yapı sağlar.
Ayrıca bu durum geliştirilen özellikler üzerinde farklı geliştiricilerin
koda kendi istedikleri veya geliştirmek istedikleri kısımları adapte edebileceği
ortamı(pull request) sağlar. Bu özellik sayesinde birlikte meslektaşlarınız
arasında fikir alışverişi yapmak kolaylaşır.
How it works?
Uzaktaki sunucudaki kodumuzda bir ana dal(master branch) vardır.
Bu dal daha önce yapılan tüm geliştirmelerin son halini içerir.
Ali projede bir özellik geliştirmek istiyor.
Ana dal üzerinden kendine ana dalın kopyasını oluşturup bilgisayarına çekiyor.
Bu kopyanın adı ali-feature-1 olsun.
Ali tüm geliştirmeleri yapar ve merkez koda eklenmesi(merge) için gönderir. Bu geliştirme aynı zamanda kodu başkalarının incelemesine olanak sağlar ve kodu bir başkası da gözden geçirerek(code review) tartışmaya olanak sağlar. Bu değişiklik hemen ana kod ile birleştirilmek zorunda değildir ve istenildiği kadar saklanabilir.
Aynı şekilde Veli de geliştirme yapmak istiyor.
Oluşturduğu kopyanin adı ise veli-feature-1 olsun.
Geliştirmelerini yapıyor,merkez koda eklenmesi isteği yapıyor ardından ana dal ile kodu birleştiriliyor(merge).
Ali ve Veli den başka bir kişi de geliştirme yapmak isteyip kopya oluşturduğunda
artık ana dal(master branch) üzerinde Veli nin yaptığı değişiklikler mevcut
olduğundan oluşturduğu kopyasında veli-feature-1 içinde yapılan değişiklikler
mevcuttur.
Yukarıdaki şekilde sürekli olarak birbirinden bağımsız özellikler geliştirebiliriz. 🙂
Gitflow Workflow
Bu iş akışı, güçlü bir sürüm-dal yapısı sağlıyor.
Büyük ölçekli projelerin yönetilmesi için güçlü bir çatı oluşturuyor.
Projeninizin her sürümünün geliştirilmesi ve tasarlanması için uygun ortam oluşturuyor.
Bu iş akışı Feature Branch Workflow un eksikliklerine yeni fikirler ve özellikler kazandırmak için geliştirilmemiştir.
Aksine eldeki işleri çok özelleştirilmiş farklı dallara ayırmayı amaçlarken diğer yandan ne zaman ve nasıl tasarlanacağını, tanımlanacağını belirler.
Ek olarak özellik dalları (feature branches) projenin yeni kazanımları için birbirinden bağımsız bireysel dallar ile bakımının yapılabilmesi ve sürümlendirilebilmesini sağlıyor.
Tabi ki Feature Branch Workflow ın tüm özelliklerinden yararlanabiliyoruz.
Gitflow Workflow her ne kadar sanal bir olgu olsada somut aracı mevcuttur.
https://github.com/nvie/gitflow
Zaten kullandığımız Git komutlarına ek olarak bu iş akışı
kullanımını kolaylaştıran, terminalinizden kullanabileceğiniz komut kümesi sağlıyor.
Temel olarak bu iş akışı,
hangi dal tipleri oluşturulabilir ve birbiri ile birleştirilebilir sorularının yanıtı kendi kurallarına göre ortaya koyuyor.
How it works
Git kullanmak istediğimiz projemizde
eğer yukarıdaki aracı kullanmak istiyorsak
git flow init
kullanmıyorsak
git init
komutları ile başlangıç yapabilirsiniz.
Oluşturacağı dal(branch) kümesi şu şekildedir
tag
master
develop
feature
release
hotfix
support
master ve develop hakkında;
Gitflow Workflow tek bir tane ana dal tutmak yerine iki dal tutma eğilimindedir. Ikisinde de aynı kod barınır fakat amaçları farklıdır.
master ana sürümlerin geçmişini temiz bir şekilde tutmayı amaçlar.Her zaman stabil ve sürüm numarası bulunan kodlar bu dal üzerinde istenildiğinde kullanılabilir durumda
hazır beklemektedir.
develop ise yeni geliştirilen tüm özelliklerin birleştirilerek koda dahil olduğu genel kodun tamamıdır.
feature hakkında;
Her yeni oluşturulan özellik için bir dal oluşturmalıyız.
örnek olarak
master ve develop dışında feature-21 veya feature-36 adı ile bir dal oluşturularak geliştirmeler saklanmalıdır.
Peki bu özellik dalını hangi merkez dal üzerinden oluşturmalıyız?
Tabi ki bu dal oluşturulurken develop tan bir kopya alınıp geliştirmeler yapılıp tekrar işi bitince develop ve master taraflarına birleştirme(merge) yapılmalıdır.
Hiç bir zaman bir feature, master dalına direk olarak birleştirilmemelidir.
release hakkında;
Bu dal aslında develop dalının bir kopyasıdır.
release üzerinde geliştirmeler yaptıktan sonra tekrar develop
dalına birleştirilir.Tam tersi de doğrudur.
Biraz daha bu durumu açalım.
develop dalından kopyalarayarak adı feature-30 olan bir dalınız olsun.
Şimdi develop aslında belirli bir release dalından
sürüm numarası 1.2 gibi bir sürümden kopyalanarak oluşturulmuştur.
Siz de feature-30 u buradan oluşturmuş oldunuz.
Sürüm oluşturulduktan sonra başka geliştiriciler develop dalına geliştirme yapmış olsalar bile etkilemez, hala release 1.2 sürümden oluşturulmuş bir kopya üzerinde geliştirme yapıyoruz.
Işimiz bittiğinde feature-30, develop ile birleştirilir(merge).
Eğer bu geliştirmeden sonra release oluşturmak istiyorsanız sürüm numarası ilerleterek
release 1.3 gibi bir kopya dal develop dalından tekrar oluşturmalısınız.
Ayrıca release 1.3 dalını da master dalına bileştirme(merge) yapmalısınız.
Sonrasında master için yeni bir sürüm(tag) numarası verilmelidir.
Ve yeni develop, release 1.3 ten bir kopya oluşturularak bu döngü devam etmeyi sürdürür.
Bu örneğe şöyle yaklaşabiliriz.
Önümüzdeki ay içinde release 201801 sürümünü çıkaracağız ve
ondan sonraki ay release 201802 sürümünü çıkarmış olacağız.
hotfix hakkında;
Genellikle canlı ortamda çalışan kodlarımızda
yeni bir sürüm çıkarılması beklenemeyen zamanlar için
oluşan hataların giderilmesi için master dan alınan kopya
olarak adlandırılır. Geliştirdiğimiz yeni özellikler hem master hemde develop
dallarına birleştirilmelidir.
hotfix dalı master dalına birleştirildikten sonra
küçük versiyon ilerlemesi yapılmalıdır.(tag 1.3 ten 1.3.1 gibi)
Çünkü büyük versiyon ilerlemesi release ile yapılmaktadır.(1.3 ten 1.4 gibi)
Tüm anlatılanları komutlar üzerinden görelim.
Bir proje oluşturduk. Klasörün içerisinde
git init
komutu ile başadık şuan merkez dal (master branch) elimizde var.
git checkout -b develop
git checkout -b release/0.1.0
git checkout develop
git checkout -b feature_branch
git checkout release/0.1.0
git merge feature_branch
git checkout develop
git merge release/0.1.0
git checkout master
git merge release/0.1.0
git branch -D release/0.1.0
Bir hotfix nasıl geliştirilir?
git checkout master
git checkout -b hotfix_branch
git checkout develop
git merge hotfix_branch
git checkout master
git merge hotfix_branch
Tüm adımları özetlersek hangi dal hangi daldan oluşturulur?
Soldaki oluşan, sağdaki oluşturulan yer.
develop < master
release < develop
feature < develop
hotfix < master
Geliştirilen değişiklikler nereye birleştirilmelidir ?
feature > develop
release > develop ve release > master
hotfix > master
Forking Workflow
Bu iş akışının temeli,
diğerlerinin odaklandığı noktaya yani tek sunucu merkezli kodun iş akışı modellerine yeni bir anlam kazandırmıştır.
Her geliştirici kendi sunucusunda kodu barındırabilir.
Bu durum her geliştiricide birbirinden bağımsız merkez kod var anlamına gelmez.
Her geliştiricinin bir yerel bir de genel deposu mevcuttur.
Bu yaklaşımı genel olarak halka açık,her geliştiriciye hitap eden, açık kaynak kodlu projelerde görebiliyoruz.
Bu iş akışının en temel avantajı,
açık kaynak projelerde bir merkez depoya kodu göndermeden projeye geliştirmeler entegre edilebilir.
Geliştirici kendi merkez deposuna geliştirici özellikleri ekler ve sadece proje yöneticileri resmi depoya bu geliştirmeyi gönderebilmektedir. Resmi olmayan geliştirmeler bu durumla birlikte gözden geçirilebilir ve kullanılabilir duruma gelir.
Temel olarak Gitflow Workflow iş akışı mantığı ile çalışır.
Bu mantık dağıtık olarak kullanıldığı için büyük ölçekli projelerde güvenli şekilde iş birlik ortamı oluşturur.
How it works
Aşağıdaki gibi bir deponuz olsun.
git clone https://repository-name/user/repo.git
Her şey resmi, herkese açık depolarda kodun tutulaması ile başlar.
Yeni bir geliştirici istediği özellikleri eklemek için direk olarak merkez kodu kopyalamayamaz. Bunun yerine kendi çalışma ortamına bir çatallama(forking) yapar.
Peki bu ne anlama gelir?
Aslında kodun tam bir kopyası sizin uzak çalışma ortamınızdadır fakat hala asıl kopyalandığı yerden tam olarak ilişkisi kesilmemiştir.
Yerel deponuzda bilgisayarınızda bir geliştirme yaptınız ardından
bunu size ait uzak deponuzdaki merkez kodunuza gönderip herkesin
görebilmesini sağlıyorsunuz. Bu geliştirmenizin bu depoyu asıl oluşturan ilk geliştiricilerinin görmesini istiyorsanız onlara bir geliştrime isteği (pull request)
yollayarak bakın ben bu geliştirmeleri yaptım kullanmak isterseniz burdan alabilirsiniz diyorsunuz. Isterlerse alıyorlar, genelde alırlar 🙂
Bu iş akılı github, bitbucket, gitlab gibi ortamlar tarafından kullanılır.
Resources
https://www.atlassian.com/git/tutorials/comparing-workflows
https://www.atlassian.com/git/tutorials/comparing-workflows/feature-branch-workflow
https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow
https://www.atlassian.com/git/tutorials/comparing-workflows/forking-workflow
Iyı günler, Iyi çalışmalar 🙂