Mundarija (42)
- Bu darsda
- 1. Nega bu kerak?
- 2. Branch — commitga ko'rsatkich
- 2.1 Hozir qaysi branch'dasiz?
- 2.2 Branch ichida nima bor?
- 2.3 Nega "arzon"?
- 3. Yangi branch yaratish va unga o'tish
- 3.1 git branch <nom> — yaratish
- 3.2 git switch — o'tish
- 3.3 Branch'da commit
- 3.4 main ga qaytish: fayllar almashadi
- 4. Tarix ayriladi
- 5. Qisqa yo'llar
- 5.1 git switch -c — yaratish va o'tish birga
- 5.2 git switch - — oldingi branch'ga qaytish
- 5.3 git checkout — eski yo'l
- 6. Branch'lar haqida ma'lumot
- 6.1 -v va -vv
- 6.2 --merged va --no-merged
- 7. Branch'ni o'chirish: -d va -D
- 7.1 -d — xavfsiz o'chirish
- 7.2 -D — majburan o'chirish
- 8. Branch nomlari
- 8.1 Qayta nomlash: git branch -m
- 8.2 master → main: eski repolar uchun
- 8.3 Yaxshi nom qoidalari
- 9. VS Code'da branch
- 10. Ko'p uchraydigan xatolar
- 10.1 Nomda bo'sh joy
- 10.2 Papka va branch to'qnashuvi
- 10.3 Nomdagi xato
- 10.4 Saqlanmagan o'zgarish yo'lni to'sadi
- 10.5 O'zgarish siz bilan birga ko'chadi
- 10.6 Branch o'rniga commit
- 11. Mashqlar
- 1-mashq (oson): Buyruqni tanlang
- 2-mashq (o'rta): Bo'sh joylarni to'ldiring
- 3-mashq (qiyin): Tarixni chizing
- 4-mashq: Portfolio qadami — birinchi branch
- 12. Real ishda
- Xulosa
- Manbalar
Git branch nima: arzon ko'rsatkich va git switch
Qisqacha: Branch (tarmoq) — bitta commitni ko'rsatib turgan nom,
.git/refs/heads/ichidagi 41 baytlik fayl. Shuning uchun uni yaratish bir lahza:git switch -c feature/bron-forma. Branch'da qilingan commitlarmainga tegmaydi — tayyor bo'lmagan ish asosiy saytni buzmaydi. Keraksiz branchgit branch -dbilan o'chiriladi, nomigit branch -mbilan almashtiriladi.
Bu darsda
- Branch aslida nima ekanini — commitga ko'rsatkich —
.gitichida o'z ko'zingiz bilan ko'rasiz. git branch,git switchvagit switch -cbilan branch yaratib, ular orasida yurasiz.- Tarix qanday "ayrilishini"
git log --graph --allva diagrammada o'qiysiz. -v,-vv,--merged,-d,-D,-mbilan branch'larni boshqarasiz.- Branch'larga
feature/,fix/kabi tartibli nom berasiz va eskimasternimainga almashtirasiz.
Oldin bilishingiz kerak: HEAD, refs va detached HEAD, Tarixni o'qish: git log, Xatoni tuzatish 1: restore va amend.
1. Nega bu kerak?
«Bahor» choyxonasida ikki ish bir vaqtda paydo bo'ldi. Jasur aka bron sahifasiga forma qo'shishni so'radi — bu bir necha kunlik ish. Shu orada menyuga shashlik narxini bugun yozish kerak.
Hozirgacha bizda bitta chiziq bor edi. Forma yarim yo'lda turganda shashlik narxini commit qilsak, yarim tayyor forma ham o'sha holatda saytga chiqadi. Formani tugatguncha kutsak — shashlik narxi kechikadi.
Yechim — branch (tarmoq): tarixning alohida chizig'i. Forma o'z chizig'ida yoziladi, shashlik narxi esa asosiy chiziqda. Ikkalasi bir-biriga xalaqit bermaydi. Forma tayyor bo'lgach, ikki chiziq birlashtiriladi — buni keyingi darsda qilamiz.
Kitobdagi xatcho'pni tasavvur qiling. Bitta kitobga bir nechta xatcho'p qo'yish mumkin: biri 40-betda, biri 112-betda. Xatcho'p kitobning nusxasi emas — shunchaki "shu yerdaman" degan belgi. Git'dagi branch ham aynan shunday: tarixdagi bitta commitga qo'yilgan nomli belgi.
Versiya nazorati darsida gitGraph chizmasining chap chetida main yozuvini ko'rgan edik va "u haqida Branch darsida gaplashamiz" degan edik. O'sha payt keldi.
2. Branch — commitga ko'rsatkich
2.1 Hozir qaysi branch'dasiz?
Biz «Bahor» reposida ishlaymiz — Birinchi repo darsida yaratgan va keyingi darslarda to'ldirgan repo. Branch'lar ro'yxatini git branch ko'rsatadi:
cd ~/kurs/bahor
git branch* mainHozircha bitta branch — main. Yulduzcha (*) — "siz shu branch'dasiz". Faqat joriy branch nomi kerak bo'lsa, git branch --show-current yozing — u yulduzchasiz, bitta nom chiqaradi.
Tarixga qaraymiz:
git log --oneline1db8b60 (HEAD -> main) Rasm: choy suratini qo'sh
56b3259 Menyu: somsa narxini qo'sh
f54f018 Git: qator oxirlarini .gitattributes bilan tartibla
07b061d Menyu: lag'mon narxini qo'sh
bd98d1b Bron: rahmat sahifasini qo'sh
b09fa2a Aloqa: sahifa yarat
9084599 Bosh sahifa: aloqa havolasini qo'sh
f4238e7 Menyu: osh narxini qo'sh
dab5bff Bahor: sayt tuzilmasini yaratYuqoridagi uch commit — .gitattributes va qator oxirlari darsidan: .gitattributes, somsa narxi va choy surati. Sizning tarixingizda boshqa darslardagi commitlar ham bor (masalan, Yaxshi commit darsidagilar), SHA'lar ham boshqacha chiqadi. Biz qisqalik uchun ularsiz ko'rsatyapmiz. Muhimi — shakl: ro'yxat yuqorida eng yangi commit bilan tugaydi.
Birinchi qatordagi qavsga qarang: (HEAD -> main). Tarixni o'qish darsida uni "bezak" deb tanigan edik. Endi uni to'liq o'qiymiz: "HEAD main ni ko'rsatadi, main esa 1db8b60 commitini".
2.2 Branch ichida nima bor?
HEAD va refs darsida .git ichidagi ikki faylni ochgan edik. Yana bir bor qaraymiz:
cat .git/HEAD
cat .git/refs/heads/mainref: refs/heads/main
1db8b6069b0c968277284b43cdf79a6d629a5515Ikki qator — ikki fayl:
HEADfayli ichida SHA yo'q, faqat "refs/heads/mainga qara" degan yozuv bor.refs/heads/mainfayli ichida esa bitta commitning to'liq SHA'si turibdi. Branch shu xolos.
Fayl hajmini o'lchaymiz:
wc -c .git/refs/heads/main41 .git/refs/heads/main41 bayt: 40 ta belgi — SHA, bittasi — qator oxiri. Branch'ning butun "og'irligi" shu.
2.3 Nega "arzon"?
Eski ba'zi versiya nazorati tizimlarida branch ochish — butun loyiha papkasini nusxalash degani edi. Katta loyihada bu daqiqalar olardi va disk to'lardi. Shuning uchun dasturchilar branch'dan qochardi.
Git'da branch yaratish — bitta kichik fayl yozish. Fayllaringiz nusxalanmaydi, commitlar takrorlanmaydi. 10 ta branch yoki 1 000 ta — farqi sezilmaydi. Shuning uchun Git dunyosida odat boshqacha: har bir kichik ish uchun alohida branch ochiladi.
Tekshirib ko'ring:
mainbranch'ida yangi commit qilsangiz,.git/refs/heads/mainfaylining ichida nima o'zgaradi?
Javob
Undagi SHA yangi commitning SHA'siga almashadi. Fayl hajmi o'sha-o'sha — 41 bayt. Branch commitlar ro'yxatini saqlamaydi: faqat oxirgi commitni biladi. Oldingi commitlar esa har bir commit ichidagi "ota" havolasi orqali topiladi (Git ichkaridan).
3. Yangi branch yaratish va unga o'tish
3.1 git branch <nom> — yaratish
Forma uchun branch ochamiz. Nomning boshidagi feature/ — "yangi imkoniyat" degan prefiks; jamoalarda branch nomi shunday boshlanadi (batafsil — «Branch nomlari» bo'limida):
git branch feature/bron-forma
git branch feature/bron-forma
* mainIkki branch bor, lekin yulduzcha hali main da. git branch <nom> faqat yaratadi, unga o'tkazmaydi. Yangi branch qayerni ko'rsatadi?
git log --oneline -21db8b60 (HEAD -> main, feature/bron-forma) Rasm: choy suratini qo'sh
56b3259 Menyu: somsa narxini qo'shIkkala nom bitta commitda turibdi. Yangi branch har doim siz turgan joyda — joriy commitda — tug'iladi. .git ichida esa yangi fayl paydo bo'ldi:
ls .git/refs/heads
ls .git/refs/heads/feature
cat .git/refs/heads/feature/bron-formafeature
main
bron-forma
1db8b6069b0c968277284b43cdf79a6d629a5515Nomdagi / papka yasadi: feature — papka, bron-forma — uning ichidagi fayl. Bu keyin bir tuzoqqa olib keladi — «Ko'p uchraydigan xatolar» bo'limida ko'ramiz. Fayl ichidagi SHA main nikiga aynan teng. Ikki xatcho'p bitta betda.
3.2 git switch — o'tish
git switch feature/bron-formaSwitched to branch 'feature/bron-forma'Tarjimasi: "feature/bron-forma branch'iga o'tildi". Endi yulduzcha ko'chdi va HEAD fayli boshqa yozuvni ko'rsatadi:
git branch
cat .git/HEAD* feature/bron-forma
main
ref: refs/heads/feature/bron-formagit switch ikki ish qiladi: HEAD ni boshqa branch'ga yo'naltiradi va ishchi papkadagi fayllarni o'sha branch'dagi holatga keltiradi. Hozir ikkala branch bitta commitda, shuning uchun fayllarda hech narsa o'zgarmadi.
3.3 Branch'da commit
Formani yozamiz. VS Code'da bron/index.html ni ochib, sarlavha ostiga oddiy forma qo'shing:
<form>
<input name="ism" placeholder="Ismingiz">
<button>Band qilish</button>
</form>Keyin tanish sikl:
git add bron/index.html
git commit -m "Bron: formani qo'sh"
git log --oneline -3[feature/bron-forma 108e327] Bron: formani qo'sh
1 file changed, 4 insertions(+)
108e327 (HEAD -> feature/bron-forma) Bron: formani qo'sh
1db8b60 (main) Rasm: choy suratini qo'sh
56b3259 Menyu: somsa narxini qo'shCommit natijasining boshiga qarang: [feature/bron-forma 108e327] — commit qaysi branch'ga yozilganini Git doim aytadi. feature/bron-forma bir qadam oldinga siljidi, main esa joyida qoldi.
Formaga telefon maydonini ham qo'shamiz (<input name="tel" type="tel"> qatori) va yana commit qilamiz:
git add bron/index.html
git commit -m "Bron: telefon maydonini qo'sh"
git log --oneline --graph --all[feature/bron-forma d6772a4] Bron: telefon maydonini qo'sh
1 file changed, 1 insertion(+)
* d6772a4 (HEAD -> feature/bron-forma) Bron: telefon maydonini qo'sh
* 108e327 Bron: formani qo'sh
* 1db8b60 (main) Rasm: choy suratini qo'sh
* 56b3259 Menyu: somsa narxini qo'sh
* f54f018 Git: qator oxirlarini .gitattributes bilan tartibla
* 07b061d Menyu: lag'mon narxini qo'sh
* bd98d1b Bron: rahmat sahifasini qo'sh
* b09fa2a Aloqa: sahifa yarat
* 9084599 Bosh sahifa: aloqa havolasini qo'sh
* f4238e7 Menyu: osh narxini qo'sh
* dab5bff Bahor: sayt tuzilmasini yarat--all — "hamma branch'larni ko'rsat", --graph — "chiziqlarni chiz" (Tarixni o'qish darsidan). Hozircha chiziq bitta: feature/bron-forma shunchaki main dan ikki qadam oldinda.
3.4 main ga qaytish: fayllar almashadi
Endi eng qiziq tajriba. main ga qaytib, bron sahifasini ochamiz:
git switch main
cat bron/index.htmlSwitched to branch 'main'
<h1>Stol band qilish</h1>Forma yo'q! Qo'rqmang — u yo'qolmadi. main hali forma yozilmagan commitni ko'rsatadi, git switch esa ishchi papkani aynan o'sha holatga keltirdi. git switch feature/bron-forma yozsangiz, forma darhol qaytib keladi. VS Code'da fayl ochiq bo'lsa, uning mazmuni ko'z oldingizda almashadi.
Bu branch'ning asosiy foydasi: yarim tayyor ish o'z chizig'ida yashaydi, main esa toza qoladi.
Diqqat: Branch almashtirishdan oldin VS Code'dagi hamma fayllarni saqlang (
Ctrl + S). Saqlanmagan o'zgarish diskda yo'q — Git uni ko'rmaydi va boshqa branch'ga o'tganingizda muharrir oynasida chalkashlik paydo bo'ladi.
Tekshirib ko'ring:
git branch tajribavagit switch -c tajriba— qaysi biridan keyin siztajribabranch'ida bo'lasiz?
Javob
Faqat ikkinchisidan. git branch tajriba branch'ni yaratadi, lekin siz joyingizda — eski branch'da qolasiz. git switch -c esa yaratadi va darhol o'tkazadi. Bu qisqa yo'lni «Qisqa yo'llar» bo'limida batafsil ko'ramiz.
4. Tarix ayriladi
Endi main da turib, bugungi shoshilinch ishni qilamiz — shashlik narxi:
echo "<p>Shashlik — 15 000 so'm</p>" >> menyu/index.html
git add menyu/index.html
git commit -m "Menyu: shashlik narxini qo'sh"
git log --oneline --graph --all[main 297cd7e] Menyu: shashlik narxini qo'sh
1 file changed, 1 insertion(+)
* 297cd7e (HEAD -> main) Menyu: shashlik narxini qo'sh
| * d6772a4 (feature/bron-forma) Bron: telefon maydonini qo'sh
| * 108e327 Bron: formani qo'sh
|/
* 1db8b60 Rasm: choy suratini qo'sh
* 56b3259 Menyu: somsa narxini qo'sh
* f54f018 Git: qator oxirlarini .gitattributes bilan tartibla
* 07b061d Menyu: lag'mon narxini qo'sh
* bd98d1b Bron: rahmat sahifasini qo'sh
* b09fa2a Aloqa: sahifa yarat
* 9084599 Bosh sahifa: aloqa havolasini qo'sh
* f4238e7 Menyu: osh narxini qo'sh
* dab5bff Bahor: sayt tuzilmasini yaratEndi rasm boshqacha. 1db8b60 dan keyin tarix ikkiga bo'lindi. Chap chiziq — main: bitta yangi commit, shashlik narxi. O'ng chiziq (| belgilari bilan) — feature/bron-forma: forma va telefon maydoni. |/ belgisi — "o'ng chiziq shu yerdan ajralib chiqqan".
Xuddi shu tarix diagrammada:
gitGraph
commit id: "56b3259 somsa"
commit id: "1db8b60 rasm"
branch feature/bron-forma
commit id: "108e327 forma"
commit id: "d6772a4 telefon"
checkout main
commit id: "297cd7e shashlik"Nimaga qarang: ikki chiziq bitta umumiy commitdan — 1db8b60 dan — boshlanadi. main dagi shashlik narxi formadan bexabar, forma esa shashlikdan bexabar. Har bir chiziqning oxirida o'z branch nomi turadi.
Shashlik narxi saytga tayyor, forma esa hali ustida ishlanmoqda. Aynan «Nega bu kerak?» bo'limidagi muammo hal bo'ldi. Ikki chiziqni qanday birlashtirish — Merge darsining mavzusi.
Tekshirib ko'ring: Hozir
git switch feature/bron-formaqilsangiz,menyu/index.htmlda shashlik narxi bo'ladimi?
Javob
Yo'q. feature/bron-forma shashlik commitidan oldin ajralgan. Uning tarixida 297cd7e yo'q, shuning uchun menyu fayli shashliksiz holatda chiqadi. Shashlik narxi formaga faqat ikki chiziq birlashtirilgandan keyin "yetib boradi".
5. Qisqa yo'llar
5.1 git switch -c — yaratish va o'tish birga
Amalda git branch + git switch o'rniga bitta buyruq yoziladi. -c — "create", yaratish:
git switch -c feature/tajriba-rangSwitched to a new branch 'feature/tajriba-rang'"Yangi feature/tajriba-rang branch'iga o'tildi". Sarlavha rangini sinab ko'ramiz va commit qilamiz:
echo 'h1 { color: darkgreen; }' >> assets/css/asosiy.css
git add assets/css/asosiy.css
git commit -m "CSS: sarlavhani yashil qil"[feature/tajriba-rang 2fb9fb3] CSS: sarlavhani yashil qil
1 file changed, 1 insertion(+)5.2 git switch - — oldingi branch'ga qaytish
Minus belgisi — "oldin qaysi branch'da bo'lsam, o'sha". Ikki branch orasida tez-tez yursangiz qulay:
git switch -Switched to branch 'main'Yana git switch - yozsangiz, feature/tajriba-rang ga qaytasiz. Terminaldagi cd - ham xuddi shunday ishlaydi.
5.3 git checkout — eski yo'l
Internetdagi maqolalarda ko'pincha boshqa yozuvni ko'rasiz:
| Eski yozuv | Zamonaviy yozuv | Ma'nosi |
|---|---|---|
git checkout feature/bron-forma |
git switch feature/bron-forma |
Branch'ga o'tish |
git checkout -b yangi |
git switch -c yangi |
Yaratib o'tish |
git checkout - |
git switch - |
Oldingisiga qaytish |
git switch Git 2.23 da (2019-yil) qo'shilgan. Undan oldin hamma narsa git checkout bilan qilinardi. Xatoni tuzatish 1 darsida ko'rganingizdek, checkout juda ko'p ish qiladi: branch almashtiradi ham, faylni tiklaydi ham. Shu sababli xato qilish oson edi. Biz kursda switch ishlatamiz, lekin eski yozuvni ko'rsangiz — endi tushunasiz.
6. Branch'lar haqida ma'lumot
6.1 -v va -vv
Oddiy git branch faqat nomlarni ko'rsatadi. -v (verbose — batafsil) har branch'ning oxirgi commitini ham qo'shadi:
git switch main
git branch -v feature/bron-forma d6772a4 Bron: telefon maydonini qo'sh
feature/tajriba-rang 2fb9fb3 CSS: sarlavhani yashil qil
* main 297cd7e Menyu: shashlik narxini qo'shQaysi branch qayerda turibdi — bir qarashda ko'rinadi. -vv (ikki marta) yana bir ma'lumot qo'shadi — GitHub'dagi nusxaga nisbatan holatni. Bizda hali GitHub bilan bog'lanish yo'q, shuning uchun natija -v nikidan farq qilmaydi:
git branch -vv feature/bron-forma d6772a4 Bron: telefon maydonini qo'sh
feature/tajriba-rang 2fb9fb3 CSS: sarlavhani yashil qil
* main 297cd7e Menyu: shashlik narxini qo'shRepo GitHub bilan bog'langach, bu yerda [origin/main: ahead 2] kabi yozuvlar paydo bo'ladi — "GitHub'dagidan 2 commit oldindasiz". Buni Remote: clone, fetch, pull, push darsida ochamiz.
6.2 --merged va --no-merged
Qaysi branch'larning ishi main ga allaqachon qo'shilgan? Hozir main da turibmiz:
git branch --merged
git branch --no-merged* main
feature/bron-forma
feature/tajriba-rangBirinchi ro'yxat (--merged) — commitlari joriy branch'da to'liq bor branch'lar. Hozir unda faqat main ning o'zi. Ikkinchi ro'yxat (--no-merged) — joriy branch'da yo'q commitlari bor branch'lar: ikkalasi ham hali birlashtirilmagan. Bu ro'yxat "qaysi branch'ni o'chirsam xavfsiz?" degan savolga javob beradi.
7. Branch'ni o'chirish: -d va -D
7.1 -d — xavfsiz o'chirish
Yashil rang yoqmadi — tajribadan voz kechamiz:
git branch -d feature/tajriba-rangerror: the branch 'feature/tajriba-rang' is not fully merged
hint: If you are sure you want to delete it, run 'git branch -D feature/tajriba-rang'
hint: Disable this message with "git config set advice.forceDeleteBranch false"Tarjimasi: "xato: feature/tajriba-rang branch'i to'liq birlashtirilmagan. Ishonchingiz komil bo'lsa, git branch -D feature/tajriba-rang ni ishga tushiring". Git sizni himoya qildi. Bu branch'dagi 2fb9fb3 commiti boshqa hech qaysi branch'da yo'q. Branch o'chsa, commitga olib boradigan nom qolmaydi.
-d (delete) faqat ishi boshqa joyga qo'shilgan branch'ni o'chiradi. Masalan, hozirgina yaratilgan va hali commit qilinmagan branch'ni:
git branch chore/eski-reja
git branch -d chore/eski-rejaDeleted branch chore/eski-reja (was 297cd7e).Bu yerda xato yo'q: 297cd7e — main ning o'zi, hech narsa yo'qolmaydi.
7.2 -D — majburan o'chirish
Tajriba commiti rostdan ham kerak emasligiga ishonchimiz komil. Katta D — "baribir o'chir":
git branch -D feature/tajriba-rangDeleted branch feature/tajriba-rang (was 2fb9fb3).Qavs ichidagi SHA'ga qarang: Git branch qaysi commitda turganini oxirgi marta aytib qo'ydi. Adashib o'chirgan bo'lsangiz, shu SHA bilan branch'ni qayta tiklash mumkin: git branch feature/tajriba-rang 2fb9fb3. SHA esingizda qolmagan bo'lsa ham umid bor — Git bir muddat hamma harakatlaringizni eslab turadi. Uni Reflog darsida o'rganamiz.
Diqqat: Siz turgan branch'ni o'chirib bo'lmaydi. Avval boshqasiga o'ting (
git switch main), keyin o'chiring.
Tekshirib ko'ring: Nega
-dbir branch'ni o'chirdi, ikkinchisini esa rad etdi?
Javob
chore/eski-reja main bilan bitta commitda turardi — uning barcha commitlari main da bor. feature/tajriba-rang da esa faqat o'zida bor commit (2fb9fb3) bor edi. -d commit "yetim" qolib ketadigan bo'lsa, o'chirishni rad etadi. Bu — ehtiyot choragi, xato emas.
8. Branch nomlari
8.1 Qayta nomlash: git branch -m
Menyuga rasmlar qo'shish uchun branch ochdik — lekin shoshilib prefiksni unutdik: git branch menyu-rasm. Nomni tuzatamiz. -m — "move", ko'chirish:
git branch -m menyu-rasm feature/menyu-rasm
git branch
ls .git/refs/heads/feature feature/bron-forma
feature/menyu-rasm
* main
bron-forma
menyu-rasmCommitlar joyida, faqat nom o'zgardi: .git/refs/heads/feature/ papkasida endi ikki fayl. Rasm ishini keyinroq boshlaymiz, hozircha branch'ni o'chirib qo'yamiz — unda bitta ham yangi commit yo'q, shuning uchun -d yetarli:
git branch -d feature/menyu-rasmDeleted branch feature/menyu-rasm (was 297cd7e).Joriy branch'ni qayta nomlash uchun eski nomni yozish shart emas: git branch -m yangi-nom.
8.2 master → main: eski repolar uchun
Git'ni o'rnatish darsida init.defaultBranch main ni sozlagan edik va "u faqat yangi repolarga ta'sir qiladi" degan edik. Sozlashdan oldin yaratilgan yoki eski qo'llanma bo'yicha ochilgan repoda branch master deb atalgan bo'lishi mumkin. Tashlab yuboriladigan sinov-git papkasida shunday repo yasab ko'ramiz:
cd ~/kurs/sinov-git
git -c init.defaultBranch=master init -q eski-loyiha
cd eski-loyiha-c — bitta buyruq uchun vaqtinchalik sozlama, -q — "jim", ortiqcha xabarsiz. Bitta fayl qo'shib commit qilgach:
git branch
git branch -m master main
git branch* master
* mainBitta buyruq — va branch endi main. Commitlar, tarix — hammasi joyida. Repo GitHub'ga ulangan bo'lsa, u yerdagi nomni ham o'zgartirish kerak — bu GitHub asoslari darsida.
8.3 Yaxshi nom qoidalari
Branch nomi — kichik harflar, so'zlar - bilan, ishning turini bildiruvchi prefiks va /:
| Prefiks | Qachon | «Bahor» misoli |
|---|---|---|
feature/ |
Yangi imkoniyat | feature/bron-forma |
fix/ |
Xatoni tuzatish | fix/aloqa-manzil |
docs/ |
Faqat hujjat, matn | docs/readme |
chore/ |
Xizmat ishi (sozlama, tozalash) | chore/eski-css |
Qat'iy qoida yo'q — jamoa o'zi kelishadi. Ba'zi joylarda bugfix/, hotfix/ yoki vazifa raqami (fix/123-aloqa) ishlatiladi. Muhimi — bir xillik: git branch ro'yxatiga qarab har branch nima uchunligini tushunish mumkin bo'lsin.
Git'ning o'z qoidalari ham bor. Nomda bo'sh joy, ~, ^, :, ?, *, [, \ belgilari, ikki nuqta (..) bo'lmaydi. Nom - bilan boshlanmaydi va . yoki .lock bilan tugamaydi. Xavotir olmang — noto'g'ri nom yozsangiz, Git o'zi aytadi.
9. VS Code'da branch
VS Code oynasining pastki chap burchagida joriy branch nomi doim ko'rinib turadi. Uni bossangiz, tepada ro'yxat ochiladi: mavjud branch'lar va "Create new branch..." bandi. Branch'ni u yerdan tanlash — git switch ning o'zi.
Terminal va VS Code bir-biriga zid emas: terminalda git switch main yozsangiz, pastki burchakdagi nom ham o'zgaradi. Kursda asosiy yo'l — terminal, chunki u hamma joyda bir xil. VS Code — qulay qo'shimcha.
10. Ko'p uchraydigan xatolar
10.1 Nomda bo'sh joy
git branch "yangi menyu"fatal: 'yangi menyu' is not a valid branch name
hint: See 'git help check-ref-format'
hint: Disable this message with "git config set advice.refSyntax false"Tarjimasi: "yangi menyu — yaroqli branch nomi emas. git help check-ref-format ga qarang". check-ref-format — Git nom qoidalarini tekshiradigan buyruq, yordam sahifasida hamma qoidalar yozilgan. Tuzatish: bo'sh joy o'rniga -: yangi-menyu.
10.2 Papka va branch to'qnashuvi
feature/bron-forma bor paytda oddiy feature nomli branch ochmoqchi bo'lamiz:
git branch featurefatal: cannot lock ref 'refs/heads/feature': 'refs/heads/feature/bron-forma' exists; cannot create 'refs/heads/feature'Tarjimasi: "refs/heads/feature ni band qilib bo'lmadi: refs/heads/feature/bron-forma mavjud, refs/heads/feature ni yaratib bo'lmaydi". Nega? «Yangi branch yaratish va unga o'tish» bo'limini eslang: feature — .git ichida allaqachon papka. Bir joyda bir xil nomli papka va fayl turolmaydi. Tuzatish: prefiksning o'zini branch nomi qilmang. Xuddi shu sababli bron va bron/forma ham birga yashay olmaydi.
10.3 Nomdagi xato
git switch feature/bron-formfatal: invalid reference: feature/bron-formTarjimasi: "yaroqsiz havola". Bunday branch yo'q — oxirgi a tushib qolgan. Qayta nomlangan branch'ning eski nomini (git switch menyu-rasm) yozsangiz ham aynan shu xabar chiqadi. Tuzatish: git branch bilan ro'yxatga qarang yoki birinchi harflarni yozib Tab bosing — Git Bash branch nomini ham to'ldiradi.
10.4 Saqlanmagan o'zgarish yo'lni to'sadi
main da bron/index.html ni o'zgartirdik, lekin commit qilmadik. Endi forma branch'iga o'tmoqchimiz:
git status -s
git switch feature/bron-forma M bron/index.html
error: Your local changes to the following files would be overwritten by checkout:
bron/index.html
Please commit your changes or stash them before you switch branches.
AbortingTarjimasi: "Quyidagi fayllardagi mahalliy o'zgarishlaringiz ustidan yozilib ketadi: bron/index.html. Branch almashtirishdan oldin o'zgarishlarni commit qiling yoki stash qiling (vaqtincha chetga oling). To'xtatildi". Git ikki branch'da farq qiladigan faylni almashtirishi kerak edi — lekin unda sizning saqlanmagan ishingiz bor. Git uni o'chirib yubormaslik uchun to'xtadi.
Tuzatish — uch yo'l:
- Ish tayyor bo'lsa — commit qiling.
- Kerak bo'lmasa —
git restore bron/index.html(Xatoni tuzatish 1). - Yarim ishni vaqtincha chetga olib qo'yish —
git stash. Buni Stash darsida o'rganamiz.
10.5 O'zgarish siz bilan birga ko'chadi
Teskari holat ham bor, u yanada chalg'itadi. Endi ikki branch'da bir xil bo'lgan faylni o'zgartirdik:
git switch feature/bron-forma
git status -sSwitched to branch 'feature/bron-forma'
M aloqa/index.html
M aloqa/index.htmlXato yo'q — branch almashdi. Switched… ostidagi M qatorini git switch ning o'zi chiqardi: "bu fayl o'zgargan holda keldi" degan eslatma. Ikkinchi M qatori — git status -s dan. Demak aloqa/index.html dagi commit qilinmagan o'zgarish siz bilan birga ko'chdi. main ga qaytsangiz ham u yana birga keladi. Commit qilinmagan o'zgarish hech qaysi branch'ga tegishli emas — u ishchi papkada yashaydi.
Boshlovchi buni ko'rmay, o'zgarishni noto'g'ri branch'da commit qilib qo'yadi. Odat: branch almashtirishdan oldin git status — "working tree clean" bo'lsin.
10.6 Branch o'rniga commit
git switch 07b061dfatal: a branch is expected, got commit '07b061d'
hint: If you want to detach HEAD at the commit, try again with the --detach option.Tarjimasi: "branch kutilgan edi, commit berildi. HEAD'ni shu commitga ajratmoqchi bo'lsangiz, --detach bilan qayta urinib ko'ring". git switch sizni tasodifan detached HEAD holatiga tushib qolishdan himoya qiladi. Eski commitni ko'rish kerak bo'lsa — git switch --detach 07b061d. Undan yangi ish boshlamoqchi bo'lsangiz — branch yarating: git switch -c yangi-nom 07b061d.
11. Mashqlar
1-mashq (oson): Buyruqni tanlang
Har bir vazifaga bitta buyruqni moslang:
| Vazifa | Buyruq |
|---|---|
| 1. Yangi branch yaratib, darhol unga o'tish | a) git branch -d fix/menyu |
| 2. Oldingi branch'ga qaytish | b) git switch -c fix/menyu |
| 3. Ishi qo'shilgan branch'ni o'chirish | c) git branch -m menyu fix/menyu |
| 4. Branch nomini almashtirish | d) git switch - |
Yechim
1 — b, 2 — d, 3 — a, 4 — c.
-c — create (yaratish), - — "oldingisi", -d — delete (o'chirish), -m — move (ko'chirish, qayta nomlash).
2-mashq (o'rta): Bo'sh joylarni to'ldiring
«Bahor» saytida aloqa sahifasiga manzil yozish kerak. Bu — xato tuzatish. Ishni alohida branch'da qiling:
git switch main
git switch fix/aloqa-manzil
echo "<p>Manzil: Toshkent, Bahor ko'chasi 7</p>" >> aloqa/index.html
git add aloqa/index.html
git commit -m "Aloqa: manzilni qo'sh"
git switch
git branch Oxirgi buyruq har branch'ning oxirgi commitini ko'rsatsin. Ishora: yaratib o'tish — «Qisqa yo'llar» bo'limi; batafsil ro'yxat — «Branch'lar haqida ma'lumot» bo'limi.
Yechim
git switch main
git switch -c fix/aloqa-manzil
echo "<p>Manzil: Toshkent, Bahor ko'chasi 7</p>" >> aloqa/index.html
git add aloqa/index.html
git commit -m "Aloqa: manzilni qo'sh"
git switch main
git branch -vgit branch -v natijasida fix/aloqa-manzil qatorida Aloqa: manzilni qo'sh commiti turadi, main qatori esa o'zgarmaydi. Bu branch'ni o'chirmang — keyingi darsda aynan u bilan birinchi birlashtirishni qilamiz. Agar mashqni «Bahor»da emas, sinov-git da qilgan bo'lsangiz, keyingi darsda uni qaytadan yaratasiz.
3-mashq (qiyin): Tarixni chizing
Tashlab yuboriladigan papkada yangi repo oching va shu buyruqlarni bajaring. Har echo dan keyin git add . va git commit -m "<harf>" qiling (xabar — faylga yozilgan harf):
cd ~/kurs/sinov-git
git init chizma
cd chizma
echo A > a.txt # commit "A"
git switch -c x
echo B > b.txt # commit "B"
git switch main
echo C > c.txt # commit "C"
git switch x
echo D > d.txt # commit "D"- Buyruqlarni bajarishdan oldin qog'ozda tarixni chizing: qaysi commit qaysi chiziqda?
git log --oneline --graph --allbilan tekshiring.- Hozir qaysi branch'dasiz va papkada qaysi
.txtfayllar bor?
Ishora: yangi branch siz turgan commitda tug'iladi («Yangi branch yaratish va unga o'tish» bo'limi), fayllar esa git switch bilan almashadi.
Yechim
Tarix: A — umumiy. x chizig'ida B va D, main chizig'ida C.
gitGraph
commit id: "A"
branch x
commit id: "B"
checkout main
commit id: "C"
checkout x
commit id: "D"Siz x branch'idasiz. Papkada a.txt, b.txt va d.txt bor. c.txt yo'q — u faqat main tarixida. git switch main qilsangiz, b.txt va d.txt yo'qolib, c.txt paydo bo'ladi. SHA'lar sizda har safar boshqacha chiqadi, shuning uchun bu yerda ularni yozmadik.
4-mashq: Portfolio qadami — birinchi branch
Bugundan boshlab portfolio'dagi har bir o'zgarish alohida branch'da boshlanadi. Birinchisi — "Men haqimda" sahifasiga yangi ko'nikma yozish: siz endi Git'ni bilasiz.
~/kurs/portfolioga o'ting.git statustoza ekanini tekshiring.feature/git-konikmabranch'ini yaratib, unga o'ting.sayt/haqimda/index.htmldagi ko'nikmalar ro'yxatiga Git bandini qo'shing (masalan,<li>Git: branch, commit, tarix</li>).- Commit qiling:
Haqimda: Git ko'nikmasini qo'sh. mainga qayting va sahifada yangi band yo'qligini ko'ring (brauzerda yokicatbilan).git branch -vvvagit log --oneline --graph --allbilan holatni tekshiring.
Branch'ni o'chirmang va main ga qo'shmang — buni keyingi darsda qilamiz.
mashqlar repo: shu darsning 1–3-mashq javoblarini mashqlar/07/15-branch/javoblar.md ga yozing va commit qiling: 07/15: branch mashqlari javoblarini qo'sh.
Yechim
cd ~/kurs/portfolio
git status
git switch -c feature/git-konikma
# VS Code'da sayt/haqimda/index.html ga <li> qo'shing
git status -s
git add sayt/haqimda/index.html
git commit -m "Haqimda: Git ko'nikmasini qo'sh"
git switch main
git branch -vv
git log --oneline --graph --allBiz qisqa sinov portfolio'sida bajardik. git status -s, commit va oxirgi ikki buyruq natijasi:
M sayt/haqimda/index.html
[feature/git-konikma fc1e527] Haqimda: Git ko'nikmasini qo'sh
1 file changed, 1 insertion(+)
feature/git-konikma fc1e527 Haqimda: Git ko'nikmasini qo'sh
* main 086fe19 Git: qator oxirlarini .gitattributes bilan tartibla
* fc1e527 (feature/git-konikma) Haqimda: Git ko'nikmasini qo'sh
* 086fe19 (HEAD -> main) Git: qator oxirlarini .gitattributes bilan tartibla
* 63190c1 Portfolio: 06-qism oxiridagi holatSizda commitlar ko'proq bo'ladi — oldingi darslardagi portfolio qadamlari ham tarixda. Muhimi: feature/git-konikma main dan bir qadam oldinda, main esa joyida. GitHub'dagi saytingizga hech narsa bo'lmadi — u hali bu repo bilan bog'lanmagan.
12. Real ishda
- Har vazifa — alohida branch. Kompaniyalarda
mainga to'g'ridan-to'g'ri commit qilish odatda taqiqlanadi. Ish branch'da qilinadi, keyin tekshiruvdan o'tibmainga qo'shiladi. Bu jarayonni Pull Request darsida ko'rasiz. - Nomlash kelishuvi. Jamoa hujjatida branch nomlari qoidasi yoziladi:
feature/,fix/, ba'zan vazifa raqami bilan. Ba'zi vositalar noto'g'ri nomli branch'ni qabul qilmaydi. - Qisqa umr. Yaxshi branch bir-ikki kunda birlashtiriladi va o'chiriladi. Oylab yashagan branch
maindan juda uzoqlashadi — birlashtirish og'rig'i shundan boshlanadi (Conflictlar darsida his qilasiz). - Intervyuda so'raladi: "Git'da branch nima?" Kuchli javob — "commitga ko'rsatkich, 41 baytlik fayl, shuning uchun arzon". "Loyihaning nusxasi" degan javob — xato.
Xulosa
- Branch — bitta commitni ko'rsatib turgan nom:
.git/refs/heads/ichidagi 41 baytlik fayl. HEADqaysi branch'da ekaningizni bildiradi; yangi commit o'sha branch'ni oldinga suradi.git switch -c nom— yaratib o'tish,git switch nom— o'tish,git switch -— oldingisiga qaytish.- Branch almashganda ishchi papkadagi fayllar ham o'sha branch holatiga keladi; commit qilinmagan o'zgarish esa siz bilan ko'chadi.
-dfaqat ishi qo'shilgan branch'ni o'chiradi,-D— majburan;-m— qayta nomlash.- Nom: kichik harf,
-, prefiks bilan (feature/,fix/);-v,--merged— holatni bilish uchun.
Keyingi dars: Merge: fast-forward va uch tomonlama birlashtirish — ikki chiziqni qanday birlashtirishni va merge commit nega ikki otali ekanini ko'ramiz.
Manbalar
- Pro Git kitobi: "Git Branching — Branches in a Nutshell" va "Basic Branching and Merging" — git-scm.com/book
- Git hujjati: "git-branch", "git-switch", "git-check-ref-format" — git-scm.com/docs
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!