8-bo‘lim
Tarmoqlar bilan ishlash
Tarmoq nima, uni yaratish, almashish, o'chirish va tarmoqlar bilan ishlashning amaliy usullari.
Ushbu bo‘lim mundarijasi
Tarmoqlar - Git ning eng kuchli imkoniyati. Ular tufayli siz asosiy kodga tegmasdan yangi g'oyalarni sinab ko'rishingiz mumkin.
Tarmoq nima? #
Avvalgi bo'limda ko'rdik: tarmoq - bitta kommit xeshi yozilgan kichkina fayl. Boshqa hech nima yo'q.
cat .git/refs/heads/main
c9d2e71a4f8b2c5d9e0f3a6b1c4d7e0f2a5b8c31
Boshqa tizimlarda tarmoq yaratish - butun loyihani nusxalash degani edi. Katta loyihada bu bir necha daqiqa vaqt olardi va disk joyini yeyardi.
Git da tarmoq yaratish - 41 baytlik fayl yozish. Bu soniyaning mingdan bir qismini oladi.
Aynan shu sabab Git da tarmoqlar bemalol ishlatiladi: har bir vazifa uchun alohida tarmoq.
Nima uchun tarmoq kerak? #
Amaliy foydasi:
| Vaziyat | Tarmoq nima beradi |
|---|---|
| Yangi imkoniyat qo'shish | Asosiy kod ishlashda davom etadi |
| Shoshilinch xato tuzatish | Tugallanmagan ishni to'xtatib turasiz |
| Tajriba qilish | Yoqmasa - tarmoqni o'chirasiz, xolos |
| Jamoaviy ish | Har kim o'z tarmog'ida, bir-biriga xalaqit bermaydi |
| Kod tekshiruvi | Pull Request faqat tarmoq orqali ishlaydi |
Tarmoqlar ro'yxati #
git branch
* main
feature/savat
xato/narx-hisobi
Yulduzcha (*) - hozir qaysi tarmoqda turganingiz.
# Batafsil
git branch -v
* main c9d2e71 Kitoblar sahifasi qo'shildi
feature/savat 8f3a1d0 Savat sahifasi yaratildi
xato/narx-hisobi 2c7b4e9 Narx yaxlitlash tuzatildi
# Masofaviylar bilan birga
git branch -a
# Faqat masofaviylar
git branch -r
Tarmoq yaratish #
# Yaratish (lekin o'tmaslik)
git branch feature/login
# Yaratish va darhol o'tish
git switch -c feature/login
# Eski uslub - hali ham ko'p ishlatiladi
git checkout -b feature/login
Switched to a new branch 'feature/login'
switch va checkoutgit switch Git 2.23 da paydo bo'ldi. U faqat tarmoq almashtirish uchun.
git checkout esa juda ko'p vazifani bajaradi: tarmoq almashtirish, fayl
qaytarish, kommitga o'tish. Bu chalkashlikka sabab bo'lardi.
Yangi kodda switch va restore ni ishlating - ular aniqroq.
Lekin checkout ni ham bilish kerak: u maqolalar va eski hujjatlarda ko'p.
Tarmoqni almashtirish #
git switch main
git switch feature/login
# Oldingi tarmoqqa qaytish
git switch -
Switched to branch 'main'
Agar saqlanmagan o'zgarishlaringiz bo'lsa, Git tarmoq almashtirishga ruxsat bermasligi mumkin:
error: Your local changes to the following files would be overwritten by checkout:
manba/index.php
Please commit your changes or stash them before you switch branches.
Uchta yechim:
- Kommit qiling:
git commit -am "ish jarayonida" - Vaqtincha saqlang:
git stash(14-bo'lim) - Bekor qiling:
git restore .
Amaliy misol #
# main tarmog'ida
git switch main
git log --oneline
c9d2e71 Kitoblar sahifasi qo'shildi
5a8b3f0 Bosh sahifa yaratildi
# Yangi vazifa uchun tarmoq
git switch -c feature/qidiruv
echo "<?php // Qidiruv sahifasi" > manba/qidiruv.php
git add manba/qidiruv.php
git commit -m "Qidiruv sahifasi yaratildi"
echo "<?php // Qidiruv mantiqi" > manba/qidiruv-mantiq.php
git add .
git commit -m "Qidiruv mantiqi qo'shildi"
git log --oneline
7d4e2f8 Qidiruv mantiqi qo'shildi
3a9c1b5 Qidiruv sahifasi yaratildi
c9d2e71 Kitoblar sahifasi qo'shildi
5a8b3f0 Bosh sahifa yaratildi
# main ga qaytamiz
git switch main
ls manba/
index.php kitoblar.php
qidiruv.php yo'q! U faqat feature/qidiruv tarmog'ida mavjud.
Tarmoq almashtirganda Git ish papkangizdagi fayllarni almashtiradi. Bu sehr emas - u shunchaki kerakli kommitdagi holatni tiklaydi.
Muharrir ochiq bo'lsa, fayllar ko'z oldingizda o'zgarayotganini ko'rasiz.
Tarmoq nomlash qoidalari #
Jamoada bir xil qoidaga amal qiling:
| Prefiks | Qachon | Misol |
|---|---|---|
feature/ | Yangi imkoniyat | feature/savat-sahifasi |
fix/ yoki bugfix/ | Xato tuzatish | fix/narx-yaxlitlash |
hotfix/ | Shoshilinch tuzatish | hotfix/tolov-xatosi |
refactor/ | Kodni qayta yozish | refactor/baza-qatlami |
docs/ | Hujjatlar | docs/api-qollanma |
test/ | Testlar | test/buyurtma-testlari |
Qoidalar:
- Kichik harflar, so'zlar orasida chiziqcha
- Bo'sh joy va o'zbek harflari ishlatmang - terminalda muammo bo'ladi
- Vazifa raqamini qo'shish foydali:
feature/142-savat
# Yomon
git branch "Yangi savat sahifasi"
git branch qwerty
git branch ish
# Yaxshi
git branch feature/savat-sahifasi
git branch fix/142-narx-hisobi
Tarmoqni o'chirish #
# Birlashtirilgan tarmoqni o'chirish
git branch -d feature/qidiruv
Deleted branch feature/qidiruv (was 7d4e2f8).
# Birlashtirilmagan bo'lsa Git ogohlantiradi
git branch -d feature/tugallanmagan
error: The branch 'feature/tugallanmagan' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature/tugallanmagan'.
# Majburan o'chirish
git branch -D feature/tugallanmagan
-D bilan ehtiyot bo'lingBirlashtirilmagan tarmoqni o'chirsangiz, undagi kommitlarga hech qanday havola qolmaydi.
Lekin ular hali ham .git/objects da turadi - git reflog bilan
30 kun ichida topish mumkin.
Foydali tarmoq buyruqlari #
# Nomini o'zgartirish
git branch -m eski-nom yangi-nom
# Joriy tarmoq nomini o'zgartirish
git branch -m yangi-nom
# main ga birlashtirilgan tarmoqlar
git branch --merged main
# Birlashtirilmagan tarmoqlar
git branch --no-merged main
# Oxirgi faollik bo'yicha saralash
git branch --sort=-committerdate -v
# Joriy tarmoq nomi
git branch --show-current
# Birlashtirilgan tarmoqlarni tozalash
git branch --merged main | grep -v "main" | xargs git branch -d
Katta loyihada 50 ta eski tarmoq to'planib qolishi mumkin. Har bir merge dan keyin tarmoqni o'chirish odat qiling - GitHub buni avtomatik qilishni ham taklif qiladi.
Ikki tarmoqni solishtirish #
# feature da bor, main da yo'q kommitlar
git log main..feature/savat --oneline
# Fayllardagi farq
git diff main feature/savat
# Faqat o'zgargan fayllar ro'yxati
git diff --name-only main feature/savat
# Ikkala tomondagi farq
git log --left-right --oneline main...feature/savat
Ajratilgan HEAD #
git switch --detach c9d2e71
Note: switching to 'c9d2e71'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them...
Siz endi tarmoqda emas, to'g'ridan-to'g'ri kommitda turibsiz.
Ajratilgan HEAD holatida kommit qilsangiz va boshqa tarmoqqa o'tsangiz, o'sha kommitlarga hech qanday havola qolmaydi.
Agar shunday holatda foydali ish qilib qo'ygan bo'lsangiz:
git switch -c yangi-tarmoq
Bu joriy holatni tarmoqqa aylantiradi va ishingizni saqlaydi.
Bu holat qachon foydali?
# Eski versiyani sinab ko'rish
git switch --detach v1.0
php -S localhost:8000 # eski versiya bilan ishlaydi
# Qaytish
git switch main
Bir vaqtda ikki tarmoqda ishlash #
git worktree add ../loyiha-hotfix hotfix/tolov
Bu ../loyiha-hotfix papkasida shu repozitoriyning ikkinchi ish nusxasini
yaratadi, hotfix/tolov tarmog'ida.
# Ro'yxat
git worktree list
# O'chirish
git worktree remove ../loyiha-hotfix
worktree foydali?- Katta loyihada tarmoq almashtirish uzoq davom etsa
- Ikki versiyani yonma-yon solishtirish kerak bo'lsa
- Test ishlab turganda boshqa tarmoqda ishlash kerak bo'lsa
.git papkasi bitta bo'ladi - disk joyi tejaladi.
maintarmog'ida ikkita kommit qiling.feature/yangiliktarmog'ini yarating va unga o'ting.- Unda uchta kommit qiling.
mainga qayting va yangi fayllar yo'qolganini ko'ring.git branch -vbilan ikkala tarmoq qaysi kommitda turganini ko'ring.git log main..feature/yangilikbilan farqni ko'ring.fix/testtarmog'ini yarating, bitta kommit qiling va uni-Dbilan o'chiring.git reflogbilan o'chirilgan kommitni toping va yangi tarmoqqa saqlang.- Tarmoq nomini
git branch -mbilan o'zgartiring.
Xulosa #
- Tarmoq - bitta kommit xeshini saqlaydigan kichkina fayl, shuning uchun arzon.
git branch- ro'yxat,git branch nom- yaratish.git switch -c nom- yaratish va o'tish (eski uslub:checkout -b).git switch -- oldingi tarmoqqa qaytish.- Tarmoq almashtirilganda ish papkasidagi fayllar ham almashadi.
- Nomlashda
feature/,fix/,hotfix/prefikslarini ishlating. -dbirlashtirilganini o'chiradi,-Dmajburan o'chiradi.- Ajratilgan HEAD da kommit qilsangiz, tarmoq yaratib saqlang.
git worktreebir vaqtda ikki tarmoqda ishlash imkonini beradi.
Keyingi bo'limda tarmoqlarni birlashtirishni va konfliktlarni o'rganamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.