Branch nima va nima uchun kerak — parallel ishlash tushunchasi

~10 daq · Git · Branch va Merge

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:

  1. To'lov — feature/tolov branch ida, xavfsiz
  2. Narx xatosi — main dan yangi hotfix/narx branch, tuzatish, main ga qo'shish, deploy
  3. feature/tolov ga 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