Git Flow — 2010-yilda Vincent Driessen tomonidan ishlab chiqilgan, qat'iy tarmoq turlariga ega Git tarmoqlanish modeli. nvie.com, 2010-ga ko'ra, Git Flow main, develop, feature, release va hotfix tarmoqlaridan aniq birlashtirish qoidalari bilan foydalanadi. Model korporativ ishlab chiqishda eng mashhur bo'lib qolmoqda, garchi zamonaviy CI/CD amaliyotlari uchun ko'pincha soddaroq yondashuvlar tanlanadi.
Asosiy fikrlar
Git Flow — ishlab chiqish, relizlar va tuzatishlarni boshqarish uchun tarmoqlar va birlashtirish qoidalarining qat'iy strukturasini belgilaydigan Git tarmoqlanish modelidir. Vincent Driessen 2010-yil yanvarida «A successful Git branching model» maqolasini nashr etdi va shu vaqtdan beri Git Flow korporativ Java va .NET ishlab chiqishida de-fakto standartga aylandi. Asosiy g'oya — kodni turli barqarorlik darajalariga ega besh turdagi tarmoqqa bo'lish.
Atlassian Git Tutorials, 2024-ga ko'ra, Git Flow ikkita doimiy tarmoqqa asoslanadi: main (ilgari master) va develop. Barcha boshqa tarmoqlar vaqtinchalik: feature, release, hotfix. Har bir tarmoq turi aniq belgilangan hayot aylanishi va birlashtirish qoidalariga ega. Mobil ishlab chiqishda Git Flow muntazam reliz sikllari (2–4 hafta) va bir nechta versiyalarni qo'llab-quvvatlaydigan loyihalarda qo'llaniladi.
Git Flow oddiy modellardan (GitHub Flow) farq qiladi, chunki u integratsiya uchun alohida develop tarmog'ini talab qiladi. Bu birlashtirish jarayoniga bir qadam qo'shadi, lekin tugallanmagan xususiyatlarning relizga tayyor koddan qo'shimcha izolyatsiyasini ta'minlaydi.
2010-yilda Vincent Driessen «A successful Git branching model» postini nashr etdi, u Git tarixidagi eng ko'p iqtibos keltirilgan postlardan biriga aylandi. Model qat'iy relizlari va parallel versiyalarni qo'llab-quvvatlaydigan loyiha uchun yaratilgan. 2020-yilda Driessen Git Flow zamonaviy CI/CD amaliyotlari uchun eskirganligini tan oldi, ammo model uzoq reliz sikli va eski versiyalarni qo'llab-quvvatlash zarurati bo'lgan loyihalar uchun dolzarbligicha qolmoqda.
# Git Flow-ni ishga tushirish
git flow init
# Feature tarmog'ini yaratish
git flow feature start "add-auth"
# Feature tarmog'ini tugatish (develop-ga birlashtirish)
git flow feature finish "add-auth"
# Release yaratish
git flow release start "1.2.0"
git flow release finish "1.2.0"
Main (ilgari master) — faqat joylashtirishga tayyor reliz kodini o'z ichiga olgan asosiy tarmoq. Main-dagi har bir commit semantik versiyalash formatidagi teg bilan belgilangan mahsulotning ma'lum versiyasiga mos kelishi kerak, masalan v1.0.0, v1.1.0. Main-da hech qanday to'g'ridan-to'g'ri ishlab chiqish olib borilmaydi — o'zgarishlar bu erga faqat release yoki hotfix tarmoqlari orqali keladi.
semver.org, 2024-ga ko'ra, main-dagi teglar MAJOR.MINOR.PATCH formatidan foydalanadi. MAJOR — API-dagi mos kelmaydigan o'zgarishlarda, MINOR — orqaga mos funksionallik qo'shilganda, PATCH — xatolar tuzatilganda oshiriladi. Git Flow-da har bir finish release avtomatik ravishda main-da versiya tegi bilan commit yaratadi.
Main tarmog'i — ishlab chiqarishga joylashtiriladigan yagona tarmoq. Mobil loyihalar uchun bu main-ga push qilinganda App Bundle yoki IPA qurish va Google Play / App Store-da nashr etish pipeline-i ishga tushishini anglatadi. GitLab CI/CD sozlamalarida main force-push va o'chirishdan himoyalangan.
Main-dagi har bir commit SemVer formatidagi teg bilan birga keladi: vMAJOR.MINOR.PATCH. MAJOR — API-dagi mos kelmaydigan o'zgarishlar uchun, MINOR — orqaga mos yangi funksionallik uchun, PATCH — xatolarni tuzatish uchun. Misol: v2.1.0 — yangi xususiyatli va xato tuzatishlarisiz ikkinchi asosiy relizni anglatadi. Git Flow-da teglar avtomatik ravishda git flow release finish buyrug'i orqali release yoki hotfix tugaganda yaratiladi.
Develop — barcha tugallangan xususiyatlarni integratsiyalash uchun mo'ljallangan Git Flow-ning ikkinchi doimiy tarmog'i. Dasturchilar kod ko'rib chiqish va CI/CD tekshiruvlaridan o'tgach, feature tarmoqlarini develop-ga birlashtiradi. Develop joriy sprintning barcha amalga oshirilgan xususiyatlarini o'z ichiga olgan eng so'nggi barqaror kod versiyasini o'z ichiga oladi.
DataSift Git Flow Guide, 2024-ga ko'ra, develop tugallanmagan integratsiyalar tufayli vaqtincha beqaror bo'lishi mumkin. Muammolarning oldini olish uchun jamoalar Continuous Integration (CI) ni qo'llaydi: har bir xususiyat develop-ga birlashtirishdan oldin to'liq testlar to'plamidan o'tadi. Agar CI muvaffaqiyatsiz bo'lsa — dasturchi keyingi birlashtirishgacha kodni tuzatadi. Develop har doim main-ning joriy versiyasiga bog'langan: relizdan so'ng darhol develop main bilan birlashtirish orqali sinxronlashtiriladi.
Feature tarmoqlari — alohida xususiyatlar, xato tuzatishlar yoki tajribalarni ishlab chiqish uchun vaqtinchalik tarmoqlar. Har bir feature tarmog'i develop-dan yaratiladi va tugallangach develop-ga qayta birlashtiriladi. Feature tarmog'ining nomi odatda vazifa raqamini yoki qisqa tavsifni o'z ichiga oladi: feature/APP-123-add-oauth, feature/redesign-profile. Git Flow-da feature tarmoqlari cheksiz muddat davomida mavjud bo'lishi mumkin.
Pro Git Book, 2024-ga ko'ra, feature tarmoqlari izolyatsiyalangan ishlab chiqish muhitidir: bir tarmoqdagi o'zgarishlar birlashtirish vaqtigacha boshqalarga ta'sir qilmaydi. Mobil loyihalarda feature tarmoqlari katta konfliktlarning oldini olish uchun rebase yoki merge orqali develop bilan sinxronlashtiriladi. MR yaratishdan oldin feature tarmog'ini develop-da rebase qilish tavsiya etiladi.
# Feature tarmog'ini qo'lda yaratish (git flowsiz)
git checkout -b feature/APP-142-add-auth develop
git commit -m "Add OAuth2 authentication with Google"
git push origin feature/APP-142-add-auth
# GitLab-da CLI orqali MR yaratish
glab mr create \
--source-branch "feature/APP-142-add-auth" \
--target-branch "develop" \
--title "Add OAuth2 authentication"
Release tarmoqlari — relizni tayyorlash uchun develop-dan yaratilgan vaqtinchalik tarmoqlar. Develop yangi versiya uchun yetarli xususiyatlar to'plamini o'z ichiga olganida, jamoa release/X.Y.Z tarmog'ini yaratadi (masalan, release/2.1.0). Bu tarmoqda faqat yakuniy o'zgarishlar kiritiladi: versiyani oshirish, lokalizatsiyani yangilash, yakuniy test, kritik xatolarni tuzatish.
Atlassian Git Tutorials, 2024-ga ko'ra, release tarmog'i asosiy muammoni hal qiladi: yakuniy o'zgarishlarni parallel ishlab chiqishdan izolyatsiyalash. Release chiqishga tayyorlanayotganda, develop-da keyingi reliz uchun yangi xususiyatlar birlashtirilishda davom etadi. Tugallangach, release tarmog'i main-ga (teg bilan) va develop-ga (versiya oshirishni sinxronlashtirish uchun) birlashtiriladi.
Hotfix tarmoqlari — ishlab chiqarishda kritik xatolarni shoshilinch tuzatish uchun vaqtinchalik tarmoqlar. Git Flow-ning develop-dan emas, balki main-dan yaratiladigan yagona tarmoq turi. Nom formati: hotfix/X.Y.Z+1 (masalan, hotfix/2.1.1). Tugallangach, hotfix tarmog'i bir vaqtning o'zida main-ga (yangi yamoq relizi sifatida) va develop-ga (tuzatishning keyingi relizlarda yo'qolmasligi uchun) birlashtiriladi.
DataSift Git Flow Guide, 2024-ga ko'ra, hotfix tarmoqlari imkon qadar qisqa bo'lishi kerak — faqat tuzatish va test. Hotfix yangi xususiyatlar yoki refaktoringni o'z ichiga olmasligi kerak. Mobil ishlab chiqishda hotfix kritik qulashlar (crash rate > 0.1%), xavfsizlik zaifliklari yoki App Store-dagi bloklovchi xatolarni tuzatish uchun qo'llaniladi.
| Tarmoq turi | Qaysidan yaratiladi | Qaysiga birlashtiriladi | Yashash muddati |
|---|---|---|---|
| Main | — | — | Doimiy |
| Develop | Main-dan | — | Doimiy |
| Feature | Develop-dan | Develop-ga | Kunlar–haftalar |
| Release | Develop-dan | Main + develop | Kunlar–hafta |
| Hotfix | Main-dan | Main + develop | Soatlar–kunlar |
Git Flow ayniqsa katta jamoalar va muntazam relizli loyihalar uchun foydali bo'lgan aniq strukturani ta'minlaydi. Afzalliklari: tugallanmagan xususiyatlarning feature tarmoqlarida izolyatsiyasi, ishlab chiqishni bloklamasdan relizni tayyorlash imkoniyati, hotfix orqali bir nechta versiyalarni qo'llab-quvvatlash. Kamchiliklari: yangi boshlovchilar uchun murakkablik, feature tarmoqlarini muntazam rebase qilish zarurati, uzoq muddatli tarmoqlardagi konfliktlar.
Martin Fowler, 2024-ga ko'ra, Git Flow-ning asosiy kamchiligi — uzoq muddatli feature tarmoqlari. Agar xususiyat 2+ hafta develop bilan sinxronlashtirilmasdan ishlab chiqilsa, birlashtirishdagi konflikt sezilarli bo'ladi. Mobil loyihalar uchun feature tarmog'ini har kuni develop-da rebase orqali sinxronlashtirish tavsiya etiladi.
Git Flow Continuous Deployment (har bir commit main-ga → ishlab chiqarishga) bo'lgan loyihalar uchun tavsiya etilmaydi. Bunday loyihalar uchun GitHub Flow yoki Trunk-Based Development soddaroq va tezroq modelni ta'minlaydi. Ammo reliz sikllari va eski versiyalarni qo'llab-quvvatlashga ega loyihalar uchun Git Flow optimal tanlov bo'lib qolmoqda.
Git Flow uch holatda muammoga aylanadi: jamoa 5 kishidan kam bo'lsa (haddan tashqari murakkablik), Continuous Deployment (yetkazib berish kechikishi), rebase intizomining yo'qligi (uzoq muddatli feature tarmoqlari birlashtirish konfliktlarini yaratadi). Agar jamoa vaqtining 20% dan ko'prog'ini tarmoqlarni birlashtirish va konfliktlarni hal qilishga sarflasa — Git Flow hatto katta jamoa uchun ham mos kelmaydi.
Git Flow alternativlari CI/CD qo'llaydigan jamoalar uchun soddaroq jarayonni taklif qiladi. GitHub Flow faqat bitta doimiy tarmoq (main) va feature tarmoqlaridan foydalanadi. Har bir xususiyat main-dan yaratiladi, ko'rib chiqish va CI dan so'ng main-ga qayta birlashtiriladi va darhol joylashtiriladi. GitHub Flow soddaroq, ammo tugallanmagan xususiyatlarning izolyatsiyasini va parallel reliz tayyorlashni qo'llab-quvvatlamaydi.
GitHub Docs, 2024-ga ko'ra, Trunk-Based Development (TBD) yanada uzoqqa boradi: barcha dasturchilar bitta tarmoqda (trunk) ishlaydi, 1–2 kunlik qisqa muddatli feature tarmoqlaridan foydalanadi. Feature toggles (xususiyat bayroqlari) tugallanmagan kodning ko'rinishini boshqaradi. TBD yuqori CI/CD intizomi va test avtomatlashtirishni talab qiladi.
Tez-tez beriladigan savollar
Git Flow — Git tarmoqlari bilan ishlash qoidalari to'plami: main (relizlar), develop (ishlab chiqish), feature (xususiyatlar), release (reliz tayyorlash) va hotfix (shoshilinch tuzatishlar). Har bir tarmoq qat'iy maqsad va birlashtirish qoidalariga ega, bu katta jamoada ishni osonlashtiradi.
Git Flow ikkita doimiy tarmoqdan (main + develop) foydalanadi, GitHub Flow — faqat main. GitHub Flow-da release va hotfix tarmoqlari yo'q: har bir xususiyat main-ga birlashtiriladi va darhol joylashtiriladi. Git Flow murakkabroq, ammo reliz sikli ustidan ko'proq nazorat beradi.
Git Flow muntazam relizli (har 2–4 haftada), bir nechta faol versiyali va katta jamoali (10 dasturchidan) loyihalar uchun mos keladi. Kichik jamoalar va Continuous Deployment uchun GitHub Flow yoki Trunk-Based Development yaxshiroq.
Rebase tavsiya etiladi: git rebase develop feature tarmog'ida har kuni yoki MR yaratishdan oldin. Rebase birlashtirish commitlarisiz chiziqli tarix beradi. Agar rebase juda ko'p konflikt keltirsa — git merge develop dan foydalaning, ammo bu merge commitlarini qo'shadi.
Asosiy tanqid — uzoq muddatli feature tarmoqlari murakkab konfliktlarga olib keladi va alohida develop tarmog'i Continuous Integration-ni sekinlashtiradi. Martin Fowler va Google jamoasi Trunk-Based Development-ni zamonaviyroq alternativ sifatida tavsiya qiladi. Git Flow qat'iy reliz sikli bo'lgan loyihalar uchun dolzarbligicha qolmoqda.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.