git branch — branch yaratish, ko'rish, o'chirish
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
maindan yarating: avvalgit switch main && git pull, keyingit 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]
-Dbirlashtirilmagan commitlarni "yo'qotadi" — ularga hech qanday branch ishora qilmay qoladi. Ular hali bir muddat.gitda saqlanadi vagit reflog(31-dars) orqali tiklash mumkin, lekin yaxshisi — o'chirishdan oldingit log sinov-2bilan 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
- Qisqa umr — branch bir necha kun, ko'pi bilan bir-ikki hafta yashasin. Uzoq yashagan branch
maindan uzoqlashib, katta conflict larga olib keladi - Birlashtirildi — o'chirildi — ish tugadi, PR qo'shildi → branch o'chirildi
- Tushunarli nomlar —
sinov-2emas,experiment/redis-kesh - Haftalik tozalash —
git branch --mergedvagit 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,-agit branch nom— yaratish (o'tmasdan);git switch -c nom— yaratish + o'tish- Yangi branch — yangilangan
maindan --merged/--no-merged— qaysilari qo'shilgan-d— xavfsiz o'chirish;-D— majburan (ehtiyot!)git push origin --delete nom— GitHub dan;git fetch --prune— izlarni tozalashgit branch -m— nom o'zgartirishgit 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