IlmHamroh
JavaScript Full-stack/7-qism. Git va GitHub asoslari4/36-dars21 daqiqa
Mundarija (30)

Birinchi Git repo: git init, git status, git add va git commit

Qisqacha: Papkani Git reposiga git init aylantiradi — ichida yashirin .git papkasi paydo bo'ladi. Keyin ish sikli to'rt qadam: faylni o'zgartirasiz, git status bilan ko'rasiz, git add bilan tanlaysiz va git commit -m "xabar" bilan saqlaysiz. git commit -a kuzatilayotgan fayllarni o'zi qo'shadi, lekin yangi fayllarni emas. Har qadamdan keyin git status — eng yaxshi odat.

Bu darsda

  • git init bilan papkani repo qilasiz va .git ichida nima paydo bo'lganini ko'rasiz.
  • git status va git status -s bilan har qadamni kuzatasiz.
  • git add va git commit -m bilan birinchi commitlaringizni qilasiz va natijasini o'qiysiz.
  • git commit -a qachon qulay va qachon tuzoq ekanini bilasiz.
  • Boshlovchilarning eng ko'p uchraydigan xatolarini — noto'g'ri papkadagi repo, pathspec, bo'sh xabar — tanib, tuzatasiz.

Oldin bilishingiz kerak: Uch hudud, Git'ni o'rnatish va birinchi sozlash, Fayl va papkalar bilan ishlash.

1. Nega bu kerak?

Oldingi darsda uch hududni tanidik va git status natijalarini o'qishni o'rgandik. Lekin repo biz tayyorlagan edi. Bugun o'zingiz yaratasiz — boshidan oxirigacha.

Git'dagi kundalik ish to'rt qadamli sikl:

  1. O'zgartirasiz — VS Code'da faylni tahrirlaysiz.
  2. Ko'rasiz — git status: nima o'zgardi?
  3. Tanlaysiz — git add: commitga nima tushadi?
  4. Saqlaysiz — git commit: tarixga yozish.
flowchart LR
  A["1. O'zgartirish<br/>(VS Code)"] --> B["2. Ko'rish<br/>git status"]
  B --> C["3. Tanlash<br/>git add"]
  C --> D["4. Saqlash<br/>git commit"]
  D --> A

Nimaga qarang: sikl yopiq — commitdan keyin yana tahrirlashga qaytasiz. Dasturchining bir kuni shu aylanani o'nlab marta bosib o'tadi.

Birinchi deploy darsida GitHub'da Commit changes tugmasini bosgan edingiz — o'shanda "commit — Git atamasi, Git qismida o'rganamiz" degan edik. Bugun o'sha tugmaning ishini terminalda, o'z kompyuteringizda qilasiz. Dars oxirida esa portfolio'ingiz birinchi marta haqiqiy Git reposiga aylanadi.

2. Tayyorgarlik: «Bahor» papkasi

Mashq uchun «Bahor» saytining qisqa nusxasini yaratamiz. Git Bash'ni oching va kurs/ papkangizga o'ting. > — natijani faylga yozish, Oqimlar va yo'naltirish darsidan tanish:

bash
cd ~/kurs
mkdir bahor
cd bahor
mkdir -p menyu bron assets/css
echo '<h1>Bahor choyxonasi</h1>' > index.html
echo '<h1>Menyu</h1>' > menyu/index.html
echo '<h1>Stol band qilish</h1>' > bron/index.html
echo 'body { font-family: sans-serif; }' > assets/css/asosiy.css

Fayllarni VS Code'da qo'lda yaratsangiz ham bo'ladi — Git uchun farqi yo'q. Muhimi — tuzilma bir xil bo'lsin: bosh sahifa, menyu, bron va bitta CSS fayl.

Bu papka hali oddiy papka. Tekshiramiz:

bash
git status
text
fatal: not a git repository (or any of the parent directories): .git

Bu xabarni Versiya nazorati darsida tahlil qilgan edik: Git .git papkasini na shu yerda, na yuqorida topdi. Agar sizda boshqa xabar chiqsa (masalan On branch main), to'xtang va «Ko'p uchraydigan xatolar» bo'limidagi "Repo noto'g'ri papkada" holatini o'qing.

3. git init — repo yaratish

3.1 Birinchi buyruq

bash
git init
text
Initialized empty Git repository in C:/Users/.../kurs/bahor/.git/

Tarjimasi: "Bo'sh Git repozitoriysi shu joyda yaratildi: ...". Yo'lning o'rtasini ... bilan qisqartirdik: biz sinovni vaqtinchalik papkada o'tkazdik. Sizda to'liq yo'l chiqadi, masalan C:/Users/Aziz/kurs/bahor/.git/. Yo'lga albatta qarang: repo aynan siz kutgan papkada yaratildimi?

hint: bilan boshlanadigan uzun maslahat chiqmadi — chunki oldingi darsda init.defaultBranch main ni sozlagansiz. Chiqsa — o'sha darsning standart branch haqidagi bo'limiga qayting.

3.2 .git ichida nima paydo bo'ldi?

bash
ls -a
text
.
..
.git
assets
bron
index.html
menyu

Yangi narsa bitta — .git. Fayllaringizga Git tegmadi. Ichiga qaraymiz:

bash
ls .git
text
HEAD
config
description
hooks
info
objects
refs

Qisqacha, har biri nima:

Nom Nima
HEAD "Hozir qaysi branch'dasiz" — HEAD va refs
config Local sozlamalar — oldingi darsda ko'rgansiz
objects Fayllar va commitlar saqlanadigan joy — Git ichkaridan
refs Branch va tag ko'rsatkichlari — Branch nima

hooks — commitdan oldin avtomatik ishlaydigan skriptlar uchun joy (Husky va lint-staged darsida kerak bo'ladi). description va info hozir ahamiyatsiz. Staging uchun index fayli esa hali yo'q — u birinchi git add da paydo bo'ladi.

Bu papkaga qo'l tegizmang — Uch hudud darsidagi ogohlantirishni eslang.

3.3 Qayta git init — xavfsiz

Adashib bir papkada ikkinchi marta git init yozsangiz nima bo'ladi? Tarixi bor «Bahor» reposida sinadik:

text
Reinitialized existing Git repository in C:/Users/.../kurs/bahor/.git/

Tarjimasi: "Mavjud Git repozitoriysi qayta ishga tushirildi". Commitlar, tarix — hammasi joyida qoladi. Git faqat yetishmayotgan xizmat fayllarini qo'shadi. Ya'ni bu xato emas, lekin kerak ham emas: har bir loyihada git init — bir marta.

4. git status — hozir nima bor?

bash
git status
text
On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	assets/
	bron/
	index.html
	menyu/

nothing added to commit but untracked files present (use "git add" to track)

Qatorma-qator:

  • On branch main — "main branch'dasiz".
  • No commits yet — "hali birorta commit yo'q". Yangi repoda doim shunday.
  • Untracked files — to'rtala element kuzatilmaydi. Papkalar ichidagi fayllar bilan birga butunligicha ko'rsatiladi (bron/, menyu/).
  • Oxirgi qator: "commitga hech narsa qo'shilmagan, lekin kuzatilmaydigan fayllar bor (kuzatish uchun git add ishlating)".

Git nima qilish kerakligini o'zi aytyapti. Keyingi qadam — git add.

5. git add — commitga tanlash

5.1 Bitta fayl

Avval faqat bosh sahifani qutiga solamiz:

bash
git add index.html
text
warning: in the working copy of 'index.html', LF will be replaced by CRLF the next time Git touches it

Qo'rqmang — bu xato emas, ogohlantirish (warning). Tarjimasi: "index.html ning ishchi nusxasida LF, Git keyingi safar unga tegganda, CRLF bilan almashtiriladi".

Tanish harflarmi? Qator oxiri darsida CRLF va LF ni o'rgangan edik. echo Git Bash'da qator oxiriga LF qo'yadi. Oldingi darsda system sozlamada core.autocrlf=true ni ko'rgan edik. Bu sozlama bilan Git repoga LF saqlaydi, Windows'dagi ishchi papkaga esa faylni CRLF bilan chiqaradi. Ogohlantirish shuni oldindan aytyapti. Fayl buzilmaydi.

Bu xabar Windows'da tez-tez chiqadi. macOS va Linux'da odatda chiqmaydi. Uni butunlay tartibga solishni — .gitattributes faylini — .gitattributes va qator oxirlari darsida o'rganamiz. Hozircha shunchaki e'tibor bermang.

Endi holatni ko'ramiz:

bash
git status
text
On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
	new file:   index.html

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	assets/
	bron/
	menyu/

index.html Changes to be committed bo'limiga o'tdi — new file belgisi bilan. Birinchi commitgacha "qutidan olish" maslahati boshqacha: git rm --cached. Qolgan uchtasi hali untracked.

Qisqa formatda:

bash
git status -s
text
A  index.html
?? assets/
?? bron/
?? menyu/

A chap ustunda — "added", staging'ga yangi qo'shilgan fayl. ?? — untracked. Ustunlarning ma'nosi Uch hudud darsidagi jadvalda.

5.2 Hammasini birdan: git add .

Qolganlarini bitta-bitta yozish shart emas. Nuqta — "joriy papka va uning ichidagi hamma narsa":

bash
git add .
text
warning: in the working copy of 'assets/css/asosiy.css', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'bron/index.html', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'menyu/index.html', LF will be replaced by CRLF the next time Git touches it

Har yangi fayl uchun o'sha CRLF ogohlantirishi. Endi:

bash
git status -s
text
A  assets/css/asosiy.css
A  bron/index.html
A  index.html
A  menyu/index.html

To'rttala fayl qutida. git status endi papkalarni emas, har bir faylni alohida ko'rsatadi — chunki ular endi Git'ga tanish.

git add ning boshqa shakllari:

Buyruq Nimani qo'shadi
git add index.html Bitta faylni
git add index.html bron/index.html Bir nechta faylni
git add menyu Papkani ichidagilari bilan
git add . Joriy papkadagi hamma narsani

Diqqat: git add . qulay, lekin ko'r-ko'rona ishlatmang. U papkadagi hamma narsani qutiga soladi — parollar yozilgan .env faylini ham, minglab fayli bor node_modules/ ni ham. Odat: git add . dan keyin darhol git status -s ga qarang. Keraksiz fayllarni oldindan chetlab o'tishni portfolio mashqida ko'rasiz.

Tekshirib ko'ring: git add . ni bahor/menyu papkasi ichida turib yozsangiz, bahor/index.html qutiga tushadimi?

Javob

Yo'q. Nuqta — joriy papka, ya'ni menyu/ va uning ichidagilar. Bosh sahifa undan yuqorida. Butun loyihani qo'shish uchun repo ildiziga qayting (cd ..) yoki fayl yo'lini aniq yozing.

6. git commit — saqlash

6.1 Birinchi commit

bash
git commit -m "Bahor: sayt tuzilmasini yarat"
text
[main (root-commit) dab5bff] Bahor: sayt tuzilmasini yarat
 4 files changed, 4 insertions(+)
 create mode 100644 assets/css/asosiy.css
 create mode 100644 bron/index.html
 create mode 100644 index.html
 create mode 100644 menyu/index.html

-m — "message", commit xabari. U qo'shtirnoq ichida, chunki bo'sh joy bor. Natijani bo'laklaymiz:

  • main — commit qaysi branch'ga yozildi.
  • (root-commit) — "ildiz commit": tarixdagi birinchi commit, undan oldin hech narsa yo'q. Bu yozuv faqat bir marta chiqadi.
  • dab5bff — commitning qisqa nomi (SHA). Sizda boshqa bo'ladi: u mazmun, muallif va vaqtdan hisoblanadi. Biz sanani ataylab bir xil qilib qo'ydik, shuning uchun kursdagi barcha misollarda bir xil chiqadi.
  • 4 files changed, 4 insertions(+) — to'rt fayl, jami to'rt qator qo'shildi.
  • create mode 100644 — yangi fayl yaratildi. 100644 — "oddiy fayl" belgisi (ishga tushiriladigan skript bo'lsa 100755 bo'lardi). Bu raqamlarni Git ichkaridan darsida ochamiz.

Commitdan keyin:

bash
git status
text
On branch main
nothing to commit, working tree clean

Uchala hudud bir xil. Tarixga qaraymiz:

bash
git log --oneline
text
dab5bff (HEAD -> main) Bahor: sayt tuzilmasini yarat

Birinchi yozuv! Qavs ichidagi (HEAD -> main) — "siz hozir shu commitdasiz, main branch shu yerda" degan belgi. U doim eng oxirgi commit yonida turadi; batafsil — HEAD va refs darsida. git log ni to'liq Tarixni o'qish darsida o'rganamiz.

6.2 -m siz commit

git commit ni -m siz yozsangiz, Git xabar yozish uchun muharrir ochadi. Qaysi muharrir — core.editor belgilaydi: Vim darsida VS Code (code --wait) sozlangan edi. Birinchi qatorga xabar yozasiz, faylni saqlab, tabni yopasiz — commit tayyor.

Xabarni bo'sh qoldirib yopsangiz:

text
Aborting commit due to empty commit message.

Tarjimasi: "Xabar bo'sh bo'lgani uchun commit bekor qilindi". Hech narsa yo'qolmadi: fayllar qutida kutib turibdi. Qaytadan git commit yozing.

Uzun, bir necha qatorli xabarlar uchun muharrir qulayroq.

Xabarning o'zi nima qilinganini aytsin. "o'zgarish", "fix", "asdf" — tarixda hech narsa demaydi. Kursda xabarlarni bitta shaklda yozamiz:

  • avval soha — o'zgarish qayerda: Bahor, Menyu, Bron;
  • keyin ikki nuqta va buyruq shaklidagi fe'l bilan nima qilish kerakligi: sayt tuzilmasini yarat, osh narxini qo'sh.

Birinchi commitimiz shunday edi: Bahor: sayt tuzilmasini yarat. Nega aynan buyruq shakli va xabar qancha uzun bo'lishi — Yaxshi commit darsida.

Tekshirib ko'ring: Nega birinchi commitda (root-commit) yozuvi chiqdi, keyingilarida esa chiqmaydi?

Javob

Birinchi commitning "ota" commiti yo'q — tarix undan boshlanadi. Keyingi har commit o'zidan oldingisiga bog'lanadi. Git faqat ota commiti bo'lmagan commitni "ildiz" deb belgilaydi.

7. Ikkinchi aylanish

Siklni yana bir marta, to'liq aylanamiz. Jasur aka menyuga osh narxini qo'shishni so'radi.

1. O'zgartiramiz. >> — fayl oxiriga qo'shish:

bash
echo "<p>Osh — 35 000 so'm</p>" >> menyu/index.html

2. Ko'ramiz:

bash
git status
text
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   menyu/index.html

no changes added to commit (use "git add" and/or "git commit -a")

modified — fayl tanish, o'zgargan, lekin qutida emas. Qisqa formatda M menyu/index.html.

Agar shu yerda add ni unutib, darhol commit qilsak-chi?

bash
git commit -m "Menyu: osh narxini qo'sh"
text
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   menyu/index.html

no changes added to commit (use "git add" and/or "git commit -a")

Commit bo'lmadi. Git git status ni ko'rsatdi va oxirgi qatorda sababini aytdi: "commitga hech narsa qo'shilmagan". Quti bo'sh — muhrlaydigan narsa yo'q.

3. Tanlaymiz va 4. saqlaymiz:

bash
git add menyu/index.html
git commit -m "Menyu: osh narxini qo'sh"
text
[main f4238e7] Menyu: osh narxini qo'sh
 1 file changed, 1 insertion(+)

Endi root-commit yo'q, create mode ham yo'q — fayl oldindan bor edi, faqat bitta qator qo'shildi. Tarix o'smoqda:

gitGraph
  commit id: "dab5bff tuzilma"
  commit id: "f4238e7 osh narxi"

Nimaga qarang: yangi commit oldingisining davomiga qo'shildi. main branch esa har doim eng oxirgi commitni ko'rsatib turadi — yangi commit qo'shilganda u ham oldinga suriladi.

8. git commit -a — qisqa yo'l va uning tuzog'i

Har safar git add yozish zerikarli tuyulishi mumkin. -a (all) flagi commitdan oldin kuzatilayotgan fayllarning barcha o'zgarishlarini o'zi qutiga soladi.

Sinaymiz. Yangi aloqa sahifasini yaratamiz va bosh sahifaga unga havola qo'shamiz:

bash
mkdir aloqa
echo '<h1>Aloqa</h1>' > aloqa/index.html
echo '<a href="aloqa/">Aloqa</a>' >> index.html
git status -s
text
 M index.html
?? aloqa/

Endi -a bilan:

bash
git commit -a -m "Bosh sahifa: aloqa havolasini qo'sh"
text
warning: in the working copy of 'index.html', LF will be replaced by CRLF the next time Git touches it
[main 9084599] Bosh sahifa: aloqa havolasini qo'sh
 1 file changed, 1 insertion(+)

1 file changed — faqat bitta! Holatni tekshiramiz:

bash
git status -s
text
?? aloqa/

Aloqa sahifasi commitga tushmadi. -a faqat Git tanigan fayllarni qo'shadi — yangi (untracked) fayllarga tegmaydi. Havola commitda bor, sahifaning o'zi esa yo'q. Kimdir shu commitni olsa, havola bosilganda sahifa topilmaydi.

Yangi faylni har doim bir marta qo'lda add qilish kerak:

bash
git add aloqa
git commit -m "Aloqa: sahifa yarat"
git log --oneline
text
[main b09fa2a] Aloqa: sahifa yarat
 1 file changed, 1 insertion(+)
 create mode 100644 aloqa/index.html
b09fa2a (HEAD -> main) Aloqa: sahifa yarat
9084599 Bosh sahifa: aloqa havolasini qo'sh
f4238e7 Menyu: osh narxini qo'sh
dab5bff Bahor: sayt tuzilmasini yarat

(git add aloqa ham CRLF ogohlantirishini chiqardi — uni qisqartirish uchun tashlab ketdik.) To'rt commit — Versiya nazorati darsida ko'rgan tarixning aynan o'zi. Endi uni o'zingiz yaratdingiz.

Xulosa: -a — faqat hamma o'zgarish bitta mantiqiy ish ekaniga va yangi fayl yo'qligiga ishonchingiz komil bo'lganda. Boshida git add + git status + git commit yo'li xavfsizroq.

Tekshirib ko'ring: git status -s natijasi M style.css va ?? logo.svg. git commit -a -m "Bosh sahifa: logo qo'sh" dan keyin qaysi fayl commitda bo'ladi?

Javob

Faqat style.css. U tracked — -a uni o'zi qo'shadi. logo.svg untracked — -a unga tegmaydi va u commitdan keyin ham ?? bo'lib qoladi. Xabar "logo qo'sh" desa-da, logoning o'zi commitda yo'q.

9. Bo'sh papkani Git ko'rmaydi

«Bahor» uchun rasmlar papkasini oldindan yaratib qo'ydik:

bash
mkdir -p assets/images
git status
text
On branch main
nothing to commit, working tree clean

Papka bor, lekin Git "hamma narsa toza" deydi. Sababi: Git fayllarni kuzatadi, papkalarni emas. Papka faqat ichidagi fayl orqali tarixga tushadi. Bo'sh papka commitda bo'lmaydi va boshqa kompyuterga ham yetib bormaydi.

Bo'sh papkani saqlash kerak bo'lsa, dasturchilar ichiga bo'sh .gitkeep fayl qo'yadi:

bash
touch assets/images/.gitkeep
git status -s
text
?? assets/images/

Endi papka ko'rindi. .gitkeep — Git'ning maxsus fayli emas, shunchaki kelishilgan nom. Istalgan nom ishlayveradi, lekin hamma shuni ishlatadi.

10. Ko'p uchraydigan xatolar

10.1 Fayl nomida xato: pathspec

bash
git add menu/index.html
text
fatal: pathspec 'menu/index.html' did not match any files

Tarjimasi: "halokatli xato: menu/index.html yo'l shabloni hech qanday faylga mos kelmadi". Pathspec — Git'ning "fayl yo'li yoki shabloni" degan so'zi. Git bunday faylni topmadi, chunki papka menyu, menu emas. Tuzatish: nomni tekshiring. Eng yaxshisi — birinchi harflarni yozib Tab bosing (Terminalda harakatlanish): shell nomni o'zi to'ldiradi va xato qilmaysiz.

10.2 "Commit qiladigan narsa yo'q"

text
On branch main
nothing to commit, working tree clean

Xato emas — hamma narsa allaqachon saqlangan. Agar "o'zgartirgan edim-ku" desangiz, tekshiring: faylni saqladingizmi (Ctrl + S)? To'g'ri papkadamisiz? VS Code'dagi o'zgarish diskka yozilmaguncha Git uni ko'rmaydi.

10.3 Yangi fayl bor, lekin qo'shilmagan

bash
git commit -m "Sinov: vaqtinchalik faylni qo'sh"
text
On branch main
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	vaqtinchalik.txt

nothing added to commit but untracked files present (use "git add" to track)

Tarjimasi (oxirgi qator): "commitga hech narsa qo'shilmagan, lekin kuzatilmaydigan fayllar bor". Commit bo'lmadi. Tuzatish: avval git add.

10.4 Repo noto'g'ri papkada

Eng xavfli xato. Aziz bahor/ o'rniga bir qavat yuqorida — kurs/ da git init yozib yubordi. Endi kurs/ ichidagi hamma narsa — portfolio, landing, mashqlar — bitta repoga tushadi. bahor/ ning o'z .git i bo'lgani uchun Git yana ogohlantiradi:

bash
cd ~/kurs
git init
git add .
text
warning: adding embedded git repository: bahor
hint: You've added another git repository inside your current repository.
hint: Clones of the outer repository will not contain the contents of
hint: the embedded repository and will not know how to obtain it.
...

Tarjimasi: "ogohlantirish: ichki git repozitoriysi qo'shilmoqda: bahor. Siz joriy repozitoriyingiz ichiga boshqa git reposini qo'shdingiz. Tashqi reponing nusxalarida ichkisining mazmuni bo'lmaydi". Pastki hint qatorlarini ... bilan qisqartirdik. Ya'ni tashqi repo bahor/ ni bitta "havola" deb saqlaydi, ichidagi fayllarni emas.

Qaysi papka repo ekanini qanday bilish mumkin? Shu buyruq repo ildizini aytadi:

bash
git rev-parse --show-toplevel
text
C:/Users/.../kurs/bahor

Uni bahor/menyu ichida yozsak ham, javob bir xil — Git yuqoriga qarab eng yaqin .git ni topadi. Kutilmagan papka chiqsa (masalan C:/Users/Aziz yoki .../kurs), demak repo noto'g'ri joyda.

Tuzatish: noto'g'ri joyda hozirgina yaratilgan, tarixi yo'q repodan faqat .git papkasini o'chirish kifoya: rm -rf .git — aynan o'sha papkada turib. Fayllaringizga tegmaydi. Lekin rm -rf qaytarib bo'lmaydigan buyruq (Fayl va papkalar bilan ishlash). Oldin pwd va git rev-parse --show-toplevel bilan qayerda turganingizni ikki marta tekshiring. Ichida commitlar bor repo bo'lsa — hech narsani o'chirmang, avval yordam so'rang.

Diqqat: Uy papkangizda (~) git init qilmang. Shunda kompyuterdagi deyarli hamma narsa bitta repoga aylanadi, har qanday papkada git status minglab faylni ko'rsatadi.

11. Mashqlar

1-mashq (oson): To'g'ri tartib

Aralashtirilgan buyruqlarni birinchi commit uchun to'g'ri tartibga soling:

text
git commit -m "Test: bosh sahifani qo'sh"
git init
git status
git add .
cd ~/kurs/test

Ishora: sikl — ko'rish, tanlash, saqlash; lekin undan oldin papkaga kirish va repo yaratish kerak.

Yechim
bash
cd ~/kurs/test
git init
git status
git add .
git commit -m "Test: bosh sahifani qo'sh"

git status ni git add . dan keyin yana bir marta yozish ham yaxshi odat — qutida nima borligini ko'rasiz.

2-mashq (o'rta): Bo'sh joylarni to'ldiring

«Bahor»ga bron sahifasi uchun "rahmat" sahifasi qo'shildi va menyuga lag'mon narxi yozildi. Ikkalasini alohida commit qiling.

bash
echo '<h1>Rahmat!</h1>' > bron/rahmat.html
echo "<p>Lag'mon — 28 000 so'm</p>" >> menyu/index.html
git status -s

git status -s natijasida menyu oldida o'ng ustunda [:M] harfi, rahmat sahifasi oldida esa [:??] belgisi turadi. Keyin:

bash
git  bron/rahmat.html
git commit -m "Bron: rahmat sahifasini qo'sh"
git add menyu/index.html
git commit  "Menyu: lag'mon narxini qo'sh"

Ishora: yangi fayl uchun -a ishlamaydi («commit -a — qisqa yo'l va uning tuzog'i» bo'limi). -m — xabar flagi.

Yechim
bash
git add bron/rahmat.html
git commit -m "Bron: rahmat sahifasini qo'sh"
git add menyu/index.html
git commit -m "Menyu: lag'mon narxini qo'sh"
git log --oneline

Biz «Bahor» reposida sinadik. git status -s:

text
 M menyu/index.html
?? bron/rahmat.html

Oxirgi git log --oneline:

text
07b061d (HEAD -> main) 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

Birinchi add faqat rahmat sahifasini qutiga soladi — menyu stolda qoladi va birinchi commitga tushmaydi. Natijada ikki alohida, tushunarli commit.

3-mashq (qiyin): Stajyorning bir kuni

Stajyor Sardor yangi choyxona/ papkasida shunday ishladi:

bash
cd ~/kurs/choyxona
git init
echo '<h1>Choyxona</h1>' > index.html
git commit -m "Boshlanish"
echo 'body { color: green; }' > style.css
git add index.html
git commit -a -m "Sahifa va stil"
git status -s
  1. Uchinchi va oltinchi buyruqlardan keyin Git nima deydi (qaysi qator muhim)?
  2. Oxirgi git status -s nimani ko'rsatadi?
  3. style.css ni ham tarixga qo'shish uchun nima qilish kerak?

Ishora: «Ko'p uchraydigan xatolar» bo'limidagi "yangi fayl bor, lekin qo'shilmagan" holati va -a ning cheklovi.

Yechim

Biz aynan shu buyruqlarni ishga tushirdik.

  1. git commit -m "Boshlanish" — commit bo'lmaydi:
text
On branch main

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	index.html

nothing added to commit but untracked files present (use "git add" to track)

Initial commit — "birinchi commit tayyorlanmoqda": yangi repoda hali commit yo'qligini bildiradi. index.html esa untracked edi. Oltinchi buyruq (git commit -a ...) ishlaydi, lekin commitga faqat index.html tushadi — u add qilingan:

text
[main (root-commit) 2bc2500] Sahifa va stil
 1 file changed, 1 insertion(+)
 create mode 100644 index.html

(Oldidan CRLF ogohlantirishi ham chiqdi — uni tashlab ketdik.)

  1. ?? style.css — -a yangi faylga tegmadi.
  2. Faylni qo'shib, alohida commit qilish:
bash
git add style.css
git commit -m "CSS: matnni yashil qil"

Commit xabari "Sahifa va stil" bo'lsa ham, stil unda yo'q edi. Xabar va mazmun mos kelmasligi — Yaxshi commit darsida bunday holatlardan qochishni o'rganamiz. Sardorning ikkala xabari kurs shakliga ham mos emas: na soha bor, na buyruq shaklidagi fe'l.

4-mashq: Portfolio qadami — portfolio Git'ga o'tadi

Bugundan boshlab portfolio'ingizning tarixi kompyuteringizda yoziladi. Hozircha faqat lokal repo qilamiz. GitHub'dagi login.github.io reposi — Birinchi deploy darsida brauzer orqali yuklangan — bilan bog'lash keyinroq, Remote: clone, fetch, pull, push darsida. U yerda ikki tarix — brauzerdagi va lokal — qanday birlashishini alohida yechamiz.

  1. Portfolio papkangizga o'ting va u hali repo emasligini tekshiring.
  2. Repo yarating. Yo'l to'g'rimi — portfolio/.git/ bilan tugaydimi?
  3. git status -s ga qarang. Qaysi qator commitga tushmasligi kerak (Uch hudud darsining portfolio qadamini eslang)?
  4. Loyiha ildizida bitta qatorli .gitignore fayl yarating: node_modules/. Bu fayl Git'ga "shu papkaga qarama" deydi (Fayl qidirish darsida ko'rgansiz; to'liq qoidalari — .gitignore darsida).
  5. Yana git status -s — node_modules/ yo'qoldimi? Keyin hammasini qo'shing va birinchi commitni qiling. Xabar: Portfolio: 06-qism oxiridagi holat.
  6. git status va git log --oneline bilan tekshiring.
Yechim
bash
cd ~/kurs/portfolio
git status
git init
git status -s
echo 'node_modules/' > .gitignore
git status -s
git add .
git status -s
git commit -m "Portfolio: 06-qism oxiridagi holat"
git status
git log --oneline

Biz 04-qism tuzilmasidagi qisqa portfolio'da sinadik. git init dan keyingi git status -s:

text
?? .htmlvalidate.json
?? .htmlvalidateignore
?? .prettierrc
?? .stylelintrc.json
?? asosiy-eski.css
?? node_modules/
?? package-lock.json
?? package.json
?? sayt/

.gitignore dan keyin node_modules/ yo'qoladi, o'rniga ?? .gitignore paydo bo'ladi. Commit natijasining boshi:

text
[main (root-commit) 63190c1] Portfolio: 06-qism oxiridagi holat
 16 files changed, 16 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 .htmlvalidate.json
...

Sizda fayllar va qatorlar soni ko'proq bo'ladi — haqiqiy sahifalaringiz uzunroq. SHA ham boshqa. Muhimi: node_modules ro'yxatda yo'q, git status esa nothing to commit, working tree clean deydi.

Ikki savolga javob:

  • package-lock.json ni commit qilish kerakmi? Ha. U npm install hamma kompyuterda aynan bir xil versiyalarni o'rnatishini ta'minlaydi. node_modules/ esa undan qayta yaratiladi.
  • asosiy-eski.css nima bo'ladi? Endi eski versiyalar tarixda saqlanadi — bunday nusxa fayllar kerak emas. Uni o'chirib, alohida commit qilishni Yaxshi commit darsida git rm bilan qilamiz.

landing/ papkangiz ham xuddi shunday repo bo'ladi — uni keyingi darslarning portfolio qadamlarida qilamiz. kurs/ ning o'zida esa git init qilmang (yuqoridagi "Repo noto'g'ri papkada" holati).

12. Real ishda

  • Har bir yangi loyiha git init bilan yoki mavjud reponi git clone qilish bilan boshlanadi. Ba'zi vositalar (masalan Next.js'ning loyiha yaratuvchisi) git init ni o'zi bajaradi — buni keyingi qismlarda ko'rasiz.
  • Kichik va tez-tez commit. Tajribali dasturchilar kuniga o'nlab commit qiladi. Har biri — bitta tugallangan qadam. Xato bo'lsa, oxirgi yaxshi holatga qaytish oson.
  • git status — refleks. Ko'p dasturchi terminal promptiga branch nomi va "o'zgargan fayllar bor" belgisini qo'yadi — status doim ko'z oldida bo'ladi.
  • Intervyuda amaliy savol beriladi: "Yangi papkadan birinchi commitgacha qaysi buyruqlarni yozasiz?", "git commit -a nimani qo'shmaydi?" Bu dars ikkalasiga ham javob.

Xulosa

  • git init papkani repo qiladi — ichida .git paydo bo'ladi; har loyihada bir marta, to'g'ri papkada.
  • Sikl: o'zgartirish → git status → git add → git commit -m "xabar".
  • git add . hamma narsani qo'shadi — undan keyin doim git status -s ga qarang.
  • git commit -a faqat tracked fayllarni qo'shadi; yangi fayl har doim qo'lda add qilinadi.
  • Windows'dagi LF will be replaced by CRLF — ogohlantirish, xato emas.
  • Bo'sh papka tarixga tushmaydi; node_modules/ ni .gitignore chetlab o'tadi.

Keyingi dars: Yaxshi commit: atomar commit va xabar yozish — bitta commitga nima sig'ishi kerakligini va tarixda o'qiladigan xabar yozishni o'rganamiz.

Manbalar

  • Pro Git kitobi: "Getting a Git Repository" va "Recording Changes to the Repository" — git-scm.com/book
  • Git hujjati: "git-init", "git-add", "git-commit", "git-status" — git-scm.com/docs
Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Birinchi Git repo: git init, git status, git add va git commit — IlmHamroh