IlmHamroh
JavaScript Full-stack/7-qism. Git va GitHub asoslari15/36-dars23 daqiqa
Mundarija (42)

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 commitlar main ga tegmaydi — tayyor bo'lmagan ish asosiy saytni buzmaydi. Keraksiz branch git branch -d bilan o'chiriladi, nomi git branch -m bilan almashtiriladi.

Bu darsda

  • Branch aslida nima ekanini — commitga ko'rsatkich — .git ichida o'z ko'zingiz bilan ko'rasiz.
  • git branch, git switch va git switch -c bilan branch yaratib, ular orasida yurasiz.
  • Tarix qanday "ayrilishini" git log --graph --all va diagrammada o'qiysiz.
  • -v, -vv, --merged, -d, -D, -m bilan branch'larni boshqarasiz.
  • Branch'larga feature/, fix/ kabi tartibli nom berasiz va eski master ni main ga 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:

bash
cd ~/kurs/bahor
git branch
text
* main

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

bash
git log --oneline
text
1db8b60 (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 yarat

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

bash
cat .git/HEAD
cat .git/refs/heads/main
text
ref: refs/heads/main
1db8b6069b0c968277284b43cdf79a6d629a5515

Ikki qator — ikki fayl:

  • HEAD fayli ichida SHA yo'q, faqat "refs/heads/main ga qara" degan yozuv bor.
  • refs/heads/main fayli ichida esa bitta commitning to'liq SHA'si turibdi. Branch shu xolos.

Fayl hajmini o'lchaymiz:

bash
wc -c .git/refs/heads/main
text
41 .git/refs/heads/main

41 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: main branch'ida yangi commit qilsangiz, .git/refs/heads/main faylining 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):

bash
git branch feature/bron-forma
git branch
text
  feature/bron-forma
* main

Ikki branch bor, lekin yulduzcha hali main da. git branch <nom> faqat yaratadi, unga o'tkazmaydi. Yangi branch qayerni ko'rsatadi?

bash
git log --oneline -2
text
1db8b60 (HEAD -> main, feature/bron-forma) Rasm: choy suratini qo'sh
56b3259 Menyu: somsa narxini qo'sh

Ikkala nom bitta commitda turibdi. Yangi branch har doim siz turgan joyda — joriy commitda — tug'iladi. .git ichida esa yangi fayl paydo bo'ldi:

bash
ls .git/refs/heads
ls .git/refs/heads/feature
cat .git/refs/heads/feature/bron-forma
text
feature
main
bron-forma
1db8b6069b0c968277284b43cdf79a6d629a5515

Nomdagi / 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

bash
git switch feature/bron-forma
text
Switched to branch 'feature/bron-forma'

Tarjimasi: "feature/bron-forma branch'iga o'tildi". Endi yulduzcha ko'chdi va HEAD fayli boshqa yozuvni ko'rsatadi:

bash
git branch
cat .git/HEAD
text
* feature/bron-forma
  main
ref: refs/heads/feature/bron-forma

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

html
<form>
  <input name="ism" placeholder="Ismingiz">
  <button>Band qilish</button>
</form>

Keyin tanish sikl:

bash
git add bron/index.html
git commit -m "Bron: formani qo'sh"
git log --oneline -3
text
[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'sh

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

bash
git add bron/index.html
git commit -m "Bron: telefon maydonini qo'sh"
git log --oneline --graph --all
text
[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:

bash
git switch main
cat bron/index.html
text
Switched 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 tajriba va git switch -c tajriba — qaysi biridan keyin siz tajriba branch'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:

bash
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
text
[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 yarat

Endi 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-forma qilsangiz, menyu/index.html da 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:

bash
git switch -c feature/tajriba-rang
text
Switched to a new branch 'feature/tajriba-rang'

"Yangi feature/tajriba-rang branch'iga o'tildi". Sarlavha rangini sinab ko'ramiz va commit qilamiz:

bash
echo 'h1 { color: darkgreen; }' >> assets/css/asosiy.css
git add assets/css/asosiy.css
git commit -m "CSS: sarlavhani yashil qil"
text
[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:

bash
git switch -
text
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:

bash
git switch main
git branch -v
text
  feature/bron-forma   d6772a4 Bron: telefon maydonini qo'sh
  feature/tajriba-rang 2fb9fb3 CSS: sarlavhani yashil qil
* main                 297cd7e Menyu: shashlik narxini qo'sh

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

bash
git branch -vv
text
  feature/bron-forma   d6772a4 Bron: telefon maydonini qo'sh
  feature/tajriba-rang 2fb9fb3 CSS: sarlavhani yashil qil
* main                 297cd7e Menyu: shashlik narxini qo'sh

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

bash
git branch --merged
git branch --no-merged
text
* main
  feature/bron-forma
  feature/tajriba-rang

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

bash
git branch -d feature/tajriba-rang
text
error: 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:

bash
git branch chore/eski-reja
git branch -d chore/eski-reja
text
Deleted 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":

bash
git branch -D feature/tajriba-rang
text
Deleted 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 -d bir 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:

bash
git branch -m menyu-rasm feature/menyu-rasm
git branch
ls .git/refs/heads/feature
text
  feature/bron-forma
  feature/menyu-rasm
* main
bron-forma
menyu-rasm

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

bash
git branch -d feature/menyu-rasm
text
Deleted 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:

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

bash
git branch
git branch -m master main
git branch
text
* master
* main

Bitta 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

bash
git branch "yangi menyu"
text
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:

bash
git branch feature
text
fatal: 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

bash
git switch feature/bron-form
text
fatal: invalid reference: feature/bron-form

Tarjimasi: "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:

bash
git status -s
git switch feature/bron-forma
text
 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.
Aborting

Tarjimasi: "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:

  1. Ish tayyor bo'lsa — commit qiling.
  2. Kerak bo'lmasa — git restore bron/index.html (Xatoni tuzatish 1).
  3. 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:

bash
git switch feature/bron-forma
git status -s
text
Switched to branch 'feature/bron-forma'
M	aloqa/index.html
 M aloqa/index.html

Xato 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

bash
git switch 07b061d
text
fatal: 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:

bash
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
bash
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 -v

git 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):

bash
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"
  1. Buyruqlarni bajarishdan oldin qog'ozda tarixni chizing: qaysi commit qaysi chiziqda?
  2. git log --oneline --graph --all bilan tekshiring.
  3. Hozir qaysi branch'dasiz va papkada qaysi .txt fayllar 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.

  1. ~/kurs/portfolio ga o'ting. git status toza ekanini tekshiring.
  2. feature/git-konikma branch'ini yaratib, unga o'ting.
  3. sayt/haqimda/index.html dagi ko'nikmalar ro'yxatiga Git bandini qo'shing (masalan, <li>Git: branch, commit, tarix</li>).
  4. Commit qiling: Haqimda: Git ko'nikmasini qo'sh.
  5. main ga qayting va sahifada yangi band yo'qligini ko'ring (brauzerda yoki cat bilan).
  6. git branch -vv va git log --oneline --graph --all bilan 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
bash
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 --all

Biz qisqa sinov portfolio'sida bajardik. git status -s, commit va oxirgi ikki buyruq natijasi:

text
 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 holat

Sizda 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 main ga to'g'ridan-to'g'ri commit qilish odatda taqiqlanadi. Ish branch'da qilinadi, keyin tekshiruvdan o'tib main ga 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 main dan 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.
  • HEAD qaysi 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.
  • -d faqat 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
Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Git branch nima: arzon ko'rsatkich va git switch — IlmHamroh