8-bo‘lim

Tarmoqlar bilan ishlash

Tarmoq nima, uni yaratish, almashish, o'chirish va tarmoqlar bilan ishlashning amaliy usullari.

🕑 19 daqiqa o‘qish 📄 784 so‘z 👁 6 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Tarmoq nima?
  2. Nima uchun tarmoq kerak?
  3. Tarmoqlar ro'yxati
  4. Tarmoq yaratish
  5. Tarmoqni almashtirish
  6. Amaliy misol
  7. Tarmoq nomlash qoidalari
  8. Tarmoqni o'chirish
  9. Foydali tarmoq buyruqlari
  10. Ikki tarmoqni solishtirish
  11. Ajratilgan HEAD
  12. Bir vaqtda ikki tarmoqda ishlash
  13. Xulosa

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.

Terminal
cat .git/refs/heads/main
Natija
c9d2e71a4f8b2c5d9e0f3a6b1c4d7e0f2a5b8c31
Nima uchun Git da tarmoq arzon?

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? #

main feature/savat feature/tolov (hali tugamagan) merge main har doim ishlaydigan holatda qoladi tayyor ish unga qo'shiladi
Har bir vazifa o'z tarmog'ida - asosiy kod buzilmaydi

Amaliy foydasi:

VaziyatTarmoq nima beradi
Yangi imkoniyat qo'shishAsosiy kod ishlashda davom etadi
Shoshilinch xato tuzatishTugallanmagan ishni to'xtatib turasiz
Tajriba qilishYoqmasa - tarmoqni o'chirasiz, xolos
Jamoaviy ishHar kim o'z tarmog'ida, bir-biriga xalaqit bermaydi
Kod tekshiruviPull Request faqat tarmoq orqali ishlaydi

Tarmoqlar ro'yxati #

Terminal
git branch
Natija
* main
  feature/savat
  xato/narx-hisobi

Yulduzcha (*) - hozir qaysi tarmoqda turganingiz.

Terminal
# Batafsil
git branch -v
Natija
* main             c9d2e71 Kitoblar sahifasi qo'shildi
  feature/savat    8f3a1d0 Savat sahifasi yaratildi
  xato/narx-hisobi 2c7b4e9 Narx yaxlitlash tuzatildi
Terminal
# Masofaviylar bilan birga
git branch -a

# Faqat masofaviylar
git branch -r

Tarmoq yaratish #

Terminal
# 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
Natija
Switched to a new branch 'feature/login'
switch va checkout

git 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 #

Terminal
git switch main
git switch feature/login

# Oldingi tarmoqqa qaytish
git switch -
Natija
Switched to branch 'main'
Saqlanmagan o'zgarishlar

Agar saqlanmagan o'zgarishlaringiz bo'lsa, Git tarmoq almashtirishga ruxsat bermasligi mumkin:

Natija
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:

  1. Kommit qiling: git commit -am "ish jarayonida"
  2. Vaqtincha saqlang: git stash (14-bo'lim)
  3. Bekor qiling: git restore .

Amaliy misol #

Terminal
# main tarmog'ida
git switch main
git log --oneline
Natija
c9d2e71 Kitoblar sahifasi qo'shildi
5a8b3f0 Bosh sahifa yaratildi
Terminal
# 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
Natija
7d4e2f8 Qidiruv mantiqi qo'shildi
3a9c1b5 Qidiruv sahifasi yaratildi
c9d2e71 Kitoblar sahifasi qo'shildi
5a8b3f0 Bosh sahifa yaratildi
Terminal
# main ga qaytamiz
git switch main
ls manba/
Natija
index.php  kitoblar.php

qidiruv.php yo'q! U faqat feature/qidiruv tarmog'ida mavjud.

Fayllar haqiqatan almashadi

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 #

Yaxshi nomlar

Jamoada bir xil qoidaga amal qiling:

PrefiksQachonMisol
feature/Yangi imkoniyatfeature/savat-sahifasi
fix/ yoki bugfix/Xato tuzatishfix/narx-yaxlitlash
hotfix/Shoshilinch tuzatishhotfix/tolov-xatosi
refactor/Kodni qayta yozishrefactor/baza-qatlami
docs/Hujjatlardocs/api-qollanma
test/Testlartest/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
Terminal
# 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 #

Terminal
# Birlashtirilgan tarmoqni o'chirish
git branch -d feature/qidiruv
Natija
Deleted branch feature/qidiruv (was 7d4e2f8).
Terminal
# Birlashtirilmagan bo'lsa Git ogohlantiradi
git branch -d feature/tugallanmagan
Natija
error: The branch 'feature/tugallanmagan' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature/tugallanmagan'.
Terminal
# Majburan o'chirish
git branch -D feature/tugallanmagan
-D bilan ehtiyot bo'ling

Birlashtirilmagan 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 #

Terminal
# 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
Terminal
# Birlashtirilgan tarmoqlarni tozalash
git branch --merged main | grep -v "main" | xargs git branch -d
Tarmoqlarni tozalab turing

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 #

Terminal
# 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 #

Terminal
git switch --detach c9d2e71
Natija
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.

Bu holatda qilingan kommitlar yo'qoladi

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:

Terminal
git switch -c yangi-tarmoq

Bu joriy holatni tarmoqqa aylantiradi va ishingizni saqlaydi.

Bu holat qachon foydali?

Terminal
# 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 #

Terminal
git worktree add ../loyiha-hotfix hotfix/tolov

Bu ../loyiha-hotfix papkasida shu repozitoriyning ikkinchi ish nusxasini yaratadi, hotfix/tolov tarmog'ida.

Terminal
# Ro'yxat
git worktree list

# O'chirish
git worktree remove ../loyiha-hotfix
Qachon 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.

Amaliy topshiriq
  1. main tarmog'ida ikkita kommit qiling.
  2. feature/yangilik tarmog'ini yarating va unga o'ting.
  3. Unda uchta kommit qiling.
  4. main ga qayting va yangi fayllar yo'qolganini ko'ring.
  5. git branch -v bilan ikkala tarmoq qaysi kommitda turganini ko'ring.
  6. git log main..feature/yangilik bilan farqni ko'ring.
  7. fix/test tarmog'ini yarating, bitta kommit qiling va uni -D bilan o'chiring.
  8. git reflog bilan o'chirilgan kommitni toping va yangi tarmoqqa saqlang.
  9. Tarmoq nomini git branch -m bilan 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.
  • -d birlashtirilganini o'chiradi, -D majburan o'chiradi.
  • Ajratilgan HEAD da kommit qilsangiz, tarmoq yaratib saqlang.
  • git worktree bir vaqtda ikki tarmoqda ishlash imkonini beradi.

Keyingi bo'limda tarmoqlarni birlashtirishni va konfliktlarni o'rganamiz.

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.