git branch — branch yaratish, ko'rish, o'chirish

~15 daq · Git · Branch va Merge

Muammodan boshlaylik

Bir oydan keyin loyihangizda:

git branch
  feature/eski-dizayn
  feature/login
  feature/savat
  fix/narx
  fix/narx-2
  sinov
  sinov-2
* main
  test-branch

Qaysilari allaqachon main ga qo'shilgan? Qaysilarini o'chirish xavfsiz? sinov-2 da nima bor edi? Branch lar ko'payib, tartibsiz bo'lib ketadi. Bu darsda — ularni yaratish, ko'rish va tartibda saqlash.


Branch lar ro'yxati

git branch
  feature/savat
* main

* — hozirgi branch.

git branch -v              # har birining oxirgi commit i bilan
  feature/savat  e5f6a7b Savat sahifasi qo'shildi
* main           a3f9c2b Bloklangan foydalanuvchilar tizimga kira olmasin
git branch -vv             # + qaysi remote branch ni kuzatadi (21-dars)
git branch -a              # remote branch lar bilan birga
git branch -r              # faqat remote branch lar
* main
  remotes/origin/HEAD -> origin/main
  remotes/origin/main
  remotes/origin/feature/tolov

Branch yaratish

git branch feature/savat

Yangi branch joriy commit da yaratiladi. Lekin siz hali eski branch dasiz — git branch faqat yaratadi, o'tkazmaydi.

Yaratish va darhol o'tish — eng ko'p ishlatiladigan shakl (14-dars):

git switch -c feature/savat

Boshqa nuqtadan yaratish

git branch hotfix/narx main          # main dan (qayerda bo'lishingizdan qat'i nazar)
git branch tajriba a3f9c2b           # aniq commit dan
git branch v1-tuzatish v1.0.0        # tegdan (36-dars)

[!TIP] Yangi feature branch ni har doim yangilangan main dan yarating: avval git switch main && git pull, keyin git switch -c feature/.... Aks holda eski kod ustida ish boshlaysiz va keyin keraksiz conflict larga duch kelasiz.


Qaysilari birlashtirilgan?

git branch --merged          # joriy branch ga allaqachon qo'shilganlar
git branch --no-merged       # hali qo'shilmaganlar

main da turib:

$ git branch --merged
  feature/login
  fix/narx
* main

$ git branch --no-merged
  feature/savat
  sinov-2

--merged dagilar — xavfsiz o'chirilishi mumkin: ularning barcha commitlari allaqachon main da.


Branch ni o'chirish

git branch -d feature/login
Deleted branch feature/login (was c1d8e5f).

-d — xavfsiz o'chirish: branch birlashtirilmagan bo'lsa, Git rad etadi:

error: The branch 'sinov-2' is not fully merged.
If you are sure you want to delete it, run 'git branch -D sinov-2'.
git branch -D sinov-2        # majburan — birlashtirilmagan commitlar yo'qolishi mumkin!

[!WARNING] -D birlashtirilmagan commitlarni "yo'qotadi" — ularga hech qanday branch ishora qilmay qoladi. Ular hali bir muddat .git da saqlanadi va git reflog (31-dars) orqali tiklash mumkin, lekin yaxshisi — o'chirishdan oldin git log sinov-2 bilan nima borligini ko'ring.

Hozirgi branch ni o'chirib bo'lmaydi — avval boshqasiga o'ting.

Remote branch ni o'chirish

git push origin --delete feature/login

GitHub da Pull Request birlashtirilgandan keyin — "Delete branch" tugmasi (yoki repozitoriy sozlamalarida "Automatically delete head branches").

Ommaviy tozalash

main ga qo'shilgan barcha lokal branch larni o'chirish:

git switch main
git branch --merged | grep -v -E '^\*|main|develop' | xargs git branch -d

(grep, xargs — Linux kursi, 14–15-darslar.) Avval xargs siz ishga tushirib, ro'yxatni ko'ring.

GitHub da o'chirilgan branch larning lokal "izlarini" tozalash:

git fetch --prune

Nomini o'zgartirish

git branch -m eski-nom yangi-nom
git branch -m yangi-nom              # joriy branch nomini

Eski repozitoriyni master dan main ga o'tkazish:

git branch -m master main
git push -u origin main
# GitHub → Settings → Branches → default branch ni main ga o'zgartiring
git push origin --delete master

Branch lar qayerga ishora qilyapti

git log --oneline --graph --all --decorate
* e5f6a7b (feature/savat) Savat sahifasi qo'shildi
* 9a4b2d1 Savat modeli
| * a3f9c2b (HEAD -> main, origin/main) Bloklangan foydalanuvchilar
|/
* 7b2e9c4 Mahsulot kartasi mobil

Branch lar bilan ishlashda eng foydali buyruq — 3-darsdagi git lg alias i. Har bir branch ning qayerda ekani va qayerdan ajralgani bir qarashda ko'rinadi.

Ikki branch farqi:

git log main..feature/savat --oneline     # feature/savat da bor, main da yo'q
git log feature/savat..main --oneline     # main da bor, feature/savat da yo'q

Tartibli branch lar uchun qoidalar

  1. Qisqa umr — branch bir necha kun, ko'pi bilan bir-ikki hafta yashasin. Uzoq yashagan branch main dan uzoqlashib, katta conflict larga olib keladi
  2. Birlashtirildi — o'chirildi — ish tugadi, PR qo'shildi → branch o'chirildi
  3. Tushunarli nomlar — sinov-2 emas, experiment/redis-kesh
  4. Haftalik tozalash — git branch --merged va git fetch --prune

Nima uchun shunday?

Nima uchun branch ni o'chirish xavfsiz — u bilan birga commitlar ham o'chmaydimi?

Yo'q — chunki branch commit emas, faqat unga ko'rsatkich (12-dars). Branch birlashtirilgan bo'lsa, uning barcha commitlari main tarixining bir qismi bo'lib qolgan — main ularga ishora qiladi. Branch o'chirilganda faqat "yorliq" olib tashlanadi; commitlar joyida. Shuning uchun -d xavfsiz: Git faqat commitlar boshqa joydan ham yetib boriladigan bo'lsagina o'chirishga ruxsat beradi. Bu Linux kursidagi havolalarga (symlink) o'xshaydi: havolani o'chirish faylni o'chirmaydi.


Xulosa

Eslab qoling:

  • git branch — ro'yxat (* — joriy); -v, -vv, -a
  • git branch nom — yaratish (o'tmasdan); git switch -c nom — yaratish + o'tish
  • Yangi branch — yangilangan main dan
  • --merged / --no-merged — qaysilari qo'shilgan
  • -d — xavfsiz o'chirish; -D — majburan (ehtiyot!)
  • git push origin --delete nom — GitHub dan; git fetch --prune — izlarni tozalash
  • git branch -m — nom o'zgartirish
  • git log --oneline --graph --all — branch lar xaritasi
  • Qisqa umrli branch lar, qo'shildi — o'chirildi

Keyingi dars

14-dars: git checkout va git switch — branch lar orasida o'tish