Branch nima va nima uchun kerak — parallel ishlash tushunchasi
Muammodan boshlaylik
Siz onlayn do'konga yangi to'lov tizimini qo'shyapsiz. Ish 3 kun davom etadi. Ikkinchi kuni rahbar qo'ng'iroq qiladi: "Saytda narxlar noto'g'ri ko'rsatilyapti, hozir tuzating!"
Muammo: sizning kodingiz yarim tayyor holatda. To'lov moduli buzilgan, testlar o'tmaydi. Narx xatosini tuzatib, deploy qilsangiz — yarim tayyor to'lov kodi ham production ga chiqadi. Kutsangiz — mijozlar 2 kun noto'g'ri narxlarni ko'radi.
Yana: jamoada 5 dasturchi. Har biri o'z vazifasi ustida. Agar hamma bitta "chiziq"da ishlasa — har birining yarim tayyor kodi boshqalarga xalaqit beradi.
Yechim — branch.
Branch — parallel olam
Branch (shoxcha, tarmoq) — tarixning mustaqil yo'nalishi. Siz asosiy koddan "ajralib" chiqasiz, o'z o'zgarishlaringizni qilasiz, va asosiy kod tegilmay qoladi.
●──●──● feature/tolov (yarim tayyor to'lov)
/
●──●──●──●──●──●──● main (ishlaydigan kod)
\
● hotfix/narx (shoshilinch tuzatish)
Darsning boshidagi vaziyat endi oddiy:
- To'lov —
feature/tolovbranch ida, xavfsiz - Narx xatosi —
maindan yangihotfix/narxbranch, tuzatish,mainga qo'shish, deploy feature/tolovga qaytib, ishni davom ettirish
main doim ishlaydigan holatda qoladi.
Branch aslida nima
Git da branch — juda yengil narsa: commit ga ko'rsatkich. 5-darsda ko'rdik — branch — .git/refs/heads/ dagi bitta kichik fayl, ichida commit hash i.
main
↓
●────●────●────●
c1 c2 c3 c4
Yangi commit qilganingizda, joriy branch ko'rsatkichi avtomatik oldinga siljiydi:
main
↓
●────●────●────●────●
c1 c2 c3 c4 c5
Yangi branch yaratish — shunchaki yangi ko'rsatkich (fayl) yaratish:
main
↓
●────●────●────●
↑
feature
Ikkalasi bir xil commit ni ko'rsatadi. Endi feature da commit qilsangiz:
main
↓
●────●────●────●────●
↑
feature
Faqat feature siljidi. main joyida qoldi.
HEAD — siz qayerdasiz
HEAD — maxsus ko'rsatkich: "hozir qaysi branch dasiz". Odatda u branch ga ishora qiladi:
HEAD
↓
main feature
↓ ↓
●────●────●────●────●
Branch almashtirsangiz (14-dars) — HEAD boshqa branch ga o'tadi, va Git ishchi papkadagi fayllarni o'sha branch holatiga keltiradi.
Nima uchun Git branch lari "arzon"?
Eski tizimlarda (SVN) branch yaratish — butun loyihani boshqa papkaga nusxalash edi: sekin, joy egallaydi. Shuning uchun branch lar kamdan-kam ishlatilardi.
Git da branch yaratish — 41 baytli fayl yozish. Bir zumda, loyiha hajmidan qat'i nazar. Natijada Git da branch lar odatiy ish uslubi: har bir vazifa, har bir tuzatish, har bir tajriba — alohida branch.
Branch lar qachon ishlatiladi
| Branch | Maqsad | Misol nomi |
|---|---|---|
| main | Ishlaydigan, production dagi kod | main |
| Feature | Yangi funksiya | feature/tolov, feat/savat |
| Bugfix | Xato tuzatish | fix/narx-formati |
| Hotfix | Shoshilinch production tuzatishi | hotfix/login-500 |
| Tajriba | "Ishlarmikin?" — ishlamasa, o'chiriladi | experiment/redis-kesh |
| Release | Relizga tayyorlash (32-dars) | release/2.1 |
Nomlash qoidalari
- Kichik harflar, so'zlar
-bilan:feature/mahsulot-qidiruvi - Prefiks — tur:
feature/,fix/,hotfix/,docs/,refactor/ - Vazifa raqami (bo'lsa):
feature/42-mahsulot-qidiruvi - Qisqa va tushunarli:
fix/x❌,fix/savat-manfiy-miqdor✅
Odatiy ish oqimi
1. main dan yangi branch git switch -c feature/savat
2. Ishlash, commit lar git commit ...
3. GitHub ga yuborish git push
4. Pull Request — ko'rib chiqish (23-dars)
5. main ga birlashtirish merge (15-dars)
6. Branch ni o'chirish git branch -d feature/savat
main ●───────●───────────────●───────
\ /
feature ●────●────●────●────●
(ajralish) (merge)
Har bir vazifa — qisqa umrli branch: bir necha soatdan bir necha kungacha. Keyin main ga qo'shiladi va o'chiriladi.
Nima uchun shunday?
Nima uchun hamma main da ishlab, shunchaki ehtiyot bo'lmaydi — branch lar ortiqcha murakkablik emasmi?
Chunki "ehtiyot bo'lish" miqyosda ishlamaydi. Bitta odam, bitta vazifa — ehtimol. Lekin 5 kishi, har birida 2–3 vazifa, va biror vazifa yarim tayyor bo'lgan har qanday paytda main buziladi. Branch lar har bir ish oqimini izolyatsiya qiladi: yarim tayyor kod boshqalarga ta'sir qilmaydi, tajriba muvaffaqiyatsiz bo'lsa — branch shunchaki o'chiriladi, va har bir o'zgarish main ga kirishdan oldin alohida ko'rib chiqiladi (Pull Request). Bu Docker kursidagi konteynerlar g'oyasiga o'xshaydi: izolyatsiya — xavfsizlik va erkinlik.
Xulosa
Eslab qoling:
- Branch — tarixning mustaqil yo'nalishi; asosiy kodga tegmasdan ishlash
- Texnik jihatdan — commit ga ko'rsatkich (kichik fayl); yaratish bir zumda
- Yangi commit — joriy branch ko'rsatkichini siljitadi
- HEAD — hozir qaysi branch dasiz
main— doim ishlaydigan holatda- Har bir vazifa — alohida, qisqa umrli branch
- Nomlar:
feature/...,fix/...,hotfix/...
Keyingi dars
13-dars: git branch — branch yaratish, ko'rish, o'chirish