Tarkibga o'tish

3 β€” Birinchi repozitoriy va uch zona

⬅️ Oldingi: 02 β€” Git'ni o'rnatish va sozlash Β· 🏠 README Β· Keyingi: 04 β€” O'zgarishlarni saqlash: add va commit ➑️

Bu bobda: oddiy papkani Git kuzatadigan repozitoriyga (repository β€” loyiha tarixi saqlanadigan joy) aylantirishni o'rganamiz: git init nima qilishini va u yaratgan yashirin .git katalogining ichida nima borligini ko'ramiz. Keyin butun kitobning eng muhim modelini β€” uch zonani (Working Directory, Staging Area, Repository) tushunamiz. Faylning hayot siklini (untracked β†’ staged β†’ committed β†’ modified) qadam-baqadam kuzatamiz va bularning hammasini bizga ko'rsatib turadigan git status buyrug'ini o'qishni mashq qilamiz.


Muammo

Tasavvur qiling: kompyuteringizda mening-saytim degan papka bor, ichida index.html fayli yotibdi. Siz uni tahrirlaysiz, saqlaysiz, yana tahrirlaysiz. Bir hafta o'tib "kechagi ishlaydigan variant qani edi?" deb o'ylab qolasiz β€” lekin papkada faqat hozirgi holat turibdi, kechagisi yo'q. index-eski.html, index-eski2.html, index-oxirgi-ishlaydigan.html kabi nusxalar yasash esa bir necha kundan keyin chalkashlikka aylanadi.

2-bobda Git'ni o'rnatib, ismingiz va emailingizni sozlab oldik. Lekin Git hali bu papkani bilmaydi β€” u oddiy papka, xuddi boshqalari kabi. Git papkangizni kuzatishi, har bir saqlangan holatni eslab qolishi uchun avval papkani repozitoriyga aylantirishimiz kerak. Mana shu bobda aynan shuni qilamiz va Git ichida fayllar qanday "zonalar" orqali harakatlanishini ko'ramiz β€” bu model kitobning qolgan hamma boblari uchun poydevor bo'ladi.

Papkani repozitoriyga aylantirish: git init

Avval ish uchun bo'sh papka yaratamiz va ichiga kiramiz. Quyidagilar buyruq qatorida (terminal) yoziladi:

mkdir mening-saytim
cd mening-saytim

πŸ“Œ mkdir β€” "make directory" (papka yarat), cd β€” "change directory" (papkaga kir). Bu Git buyruqlari emas, oddiy terminal buyruqlari. Windows'da Git Bash'da ham xuddi shunday ishlaydi.

Endi sehrli buyruq:

git init

Natija:

Initialized empty Git repository in C:/.../mening-saytim/.git/

Tabriklaymiz β€” papkangiz endi repozitoriy! git init ("initialize" β€” boshlang'ich holatga keltirish) papka ichida .git degan yashirin katalog yaratdi. Mana shu katalogning borligi papkani oddiy papkadan repozitoriyga ajratib turadi: bundan keyin Git shu papkadagi o'zgarishlarni kuzata oladi.

πŸ’‘ git init ni faqat bir marta β€” loyihaning eng boshida bajariladi. Keyin u papkada qayta-qayta yozish shart emas (va zararli ham).

πŸ“Œ Branch nomi haqida β€” muhim aniqlik: Git standart bo'yicha hali ham master nomli branch (shox) yaratadi β€” bu Git'ning ichiga o'rnatilgan qadimiy default va u o'zgargani yo'q. Lekin biz 2-bobda git config --global init.defaultBranch main deb sozlab qo'yganmiz, shuning uchun sizning kompyuteringizda git init main yaratadi va quyida On branch main ko'rasiz. Agar 2-bobni o'tkazib yuborgan yoki yangi mashinada ishlayotgan bo'lsangiz, master chiqishi mumkin β€” bunda chalkashmang, bir marta git config --global init.defaultBranch main yozib qo'ying (mavjudligini git config --global init.defaultBranch bilan tekshirasiz: bo'sh chiqsa, hali sozlanmagan). Eski papkadagi master'ni main'ga o'zgartirish uchun esa git branch -M main ishlatiladi.

.git katalogini topish

.git "yashirin" deyilishiga sabab β€” nomi nuqta bilan boshlanadi, shuning uchun oddiy ls yoki fayl menejeri uni ko'rsatmaydi. Ko'rish uchun:

ls -a

-a ("all" β€” hammasi) yashirin fayllarni ham ko'rsatadi. Natijada .git papkasini ko'rasiz. Uning ichiga ham qarab qo'yaylik:

ls .git
HEAD
config
description
hooks
info
objects
refs

Hozircha bu nomlar tushunarsiz β€” bu normal. Eng muhimlarini bilib qo'yaylik:

Element Vazifasi
HEAD Hozir qaysi branch'da turganingizni ko'rsatadi (ichida ref: refs/heads/main deb yozilgan β€” 2-bobni o'tkazib yuborgan bo'lsangiz refs/heads/master)
config Aynan shu repozitoriyning sozlamalari
objects/ Asosiy ombor β€” commitlar va fayl mazmuni shu yerda saqlanadi
refs/ Branch'lar qaysi commitga ishora qilishi
index Staging Area (keyinroq, birinchi git add'dan keyin paydo bo'ladi)

.git yashirin katalogi ichidagi asosiy elementlar: HEAD, config, index, refs va objects

❌ .git ni o'chirmang va ichini qo'lda tahrirlamang! Bu katalog β€” loyihangizning butun xotirasi. Agar uni o'chirsangiz, papka oddiy papkaga aylanadi va saqlangan barcha tarix yo'qoladi (qaytarib bo'lmaydi). Git bilan ishlash uchun har doim git ... buyruqlaridan foydalaning, fayllarga to'g'ridan-to'g'ri tegmang.

Kitobning eng muhim modeli: uch zona

Endi butun Git'ni tushunishning kalitiga keldik. Git'da fayllaringiz uchta "zona"da yashashi mumkin. Bu modelni bir marta yaxshilab tushunsangiz, keyingi hamma narsa osonlashadi.

Git'ning uch zonasi: Working Directory'dan git add bilan Staging Area'ga, undan git commit bilan Repository'ga o'tish

  1. Working Directory (ishchi katalog) β€” bu siz ko'rib, tahrir qiladigan oddiy papka. Hozir index.html yozsangiz, u shu yerda paydo bo'ladi. Bu yerda hamma narsa "jonli" β€” istalgancha o'zgartirasiz.

  2. Staging Area (tayyorlash maydoni; index deb ham ataladi) β€” bu "surat oldidagi qator". Bu yerga keyingi saqlashga (commit) aynan qaysi o'zgarishlarni kiritmoqchi ekaningizni tanlab qo'yasiz. Hamma o'zgarishni emas, faqat tayyorlarini tanlash mumkin.

  3. Repository (.git katalogi) β€” bu yerda saqlangan suratlar (commitlar) abadiy yotadi. Bu zonaga tushgan narsa loyiha tarixiga aylanadi va istalgan paytda unga qaytib borishingiz mumkin.

Bu zonalar orasida fayllar ikkita buyruq orqali harakatlanadi:

  • git add β€” faylni Working Directory'dan Staging Area'ga ko'chiradi ("buni keyingi suratga qo'sh").
  • git commit β€” Staging Area'dagi hamma narsani Repository'ga yozadi ("surat ol va abadiy saqla").

πŸ’‘ Uy quvonchini fotosessiyaga o'xshating: Working Directory β€” butun xona (hamma narsa harakatda). Staging Area β€” kadrga kim turishini tanlash (suratga tushadiganlarni saralaysiz). Commit β€” tugmani bosib, suratni abadiy saqlash. Surat olingach o'zgarmaydi β€” xuddi commit kabi.

Faylning hayot sikli va git status

Endi nazariyani amalda ko'ramiz. Yangi fayl yaratamiz va uning Git ko'zida qanday "holatlar"dan o'tishini kuzatamiz. Bu sayohatda bizga doimiy hamroh β€” git status buyrug'i. U har doim aytib turadi: "fayllaring qaysi zonada, nima qilishing kerak".

Fayl hayot sikli: untracked holatdan git add bilan staged, git commit bilan committed, tahrirdan keyin modified holatga o'tishi

1-holat: untracked (kuzatilmaydigan)

Papkaga yangi fayl yaratamiz:

echo "Salom, Git!" > index.html

πŸ“Œ echo "..." > fayl β€” qavs ichidagi matnni faylga yozadi. Albatta, faylni oddiy matn muharririda ham yaratishingiz mumkin β€” natija bir xil.

Endi holatni so'raymiz:

git status
On branch main

No commits yet

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)

Git aytyapti: "index.html degan Untracked (kuzatilmaydigan) fayl bor". Ya'ni fayl Working Directory'da yotibdi, lekin Git uni hali tarixda kuzatmayapti β€” u yangi, Git uni "ko'rgan", ammo hali e'tiborga olmagan. E'tibor bering, Git'ning o'zi yo'l-yo'riq beryapti: "use git add ..." β€” "kuzatish uchun git add ishlating".

πŸ’‘ git status'ni tez-tez yozing β€” bu uyat emas, balki yaxshi odat. Tajribali dasturchilar ham har bir qadamdan keyin status tekshiradi. Qisqa variantni ko'rish uchun git status -s (yoki --short) ishlating:

?? index.html

?? β€” "bu fayl haqida Git hech narsa bilmaydi" degani (untracked).

2-holat: staged (tayyorlangan)

Endi faylni Staging Area'ga qo'shamiz:

git add index.html
git status
On branch main

No commits yet

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

Mana o'zgarish! Endi fayl "Changes to be committed" ("commit qilinadigan o'zgarishlar") ro'yxatida β€” ya'ni staged. U Working Directory'dan Staging Area'ga ko'chdi. new file: index.html β€” "bu yangi fayl, keyingi commitga tayyor". Qisqa shaklda:

A  index.html

A ("Added") yashil rangda chap tomonda β€” fayl tayyorlangan degani.

πŸ“Œ Muhim nuqta: git add faylning aynan hozirgi holatini Staging'ga oladi. Agar add'dan keyin faylni yana tahrirlasangiz, yangi o'zgarish avtomatik staging'ga tushmaydi β€” uni qaytadan git add qilish kerak. Buni 4-bobda batafsil ko'ramiz.

πŸ’‘ Windows'da git add paytida bunday ogohlantirish chiqishi mumkin: warning: ... LF will be replaced by CRLF .... Bu xato emas β€” Git fayl satr oxiri belgilarini Windows uslubiga moslashtirayotgani haqida xabar beryapti. Hozircha e'tibor bermasangiz ham bo'ladi.

3-holat: committed (saqlangan)

Endi suratni olamiz β€” Staging'dagini Repository'ga yozamiz:

git commit -m "Birinchi commit: index.html qoshildi"
git status

πŸ“Œ -m ("message" β€” xabar) commitga qisqacha izoh biriktiradi: "bu suratda nima o'zgardi". Izoh majburiy β€” uni yozmasangiz, Git matn muharririni ochib so'raydi. Yaxshi izoh kelajakdagi o'zingizga (va jamoadoshlaringizga) yordam beradi.

git status natijasi:

On branch main
nothing to commit, working tree clean

"working tree clean" ("ishchi katalog toza") β€” bu eng tinch xabar: Working Directory bilan oxirgi commit bir xil, saqlanmagan o'zgarish yo'q. Faylimiz endi committed holatda β€” Repository'ga abadiy yozildi.

Saqlanganini ko'rish uchun tarixga qaraymiz:

git log --oneline
a1b2c3d Birinchi commit: index.html qoshildi

Chapdagi a1b2c3d β€” commit'ning noyob identifikatori (hash). Bu yerda misol uchun shunday yozildi; sizning kompyuteringizda boshqacha, haqiqiy hash chiqadi β€” har bir commit uchun u o'ziga xos va takrorlanmas bo'ladi. git log'ni keyingi boblarda batafsil o'rganamiz.

4-holat: modified (o'zgartirilgan)

Endi faylni biroz tahrirlaymiz β€” saytimizga sarlavha qo'shamiz:

echo "<h1>Mening saytim</h1>" >> index.html
git status

πŸ“Œ Diqqat: bu safar >> (ikkita belgisi) ishlatdik β€” u faylni o'chirib qayta yozmaydi, balki oxiriga qo'shadi. Bitta > esa faylni butunlay o'chirib, yangidan yozadi.

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:   index.html

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

Endi fayl modified (o'zgartirilgan) holatda. Bu untracked'dan farq qiladi: Git faylni allaqachon biladi (avval commit qilingan), shunchaki uning yangi versiyasi oxirgi suratdan farq qilyapti. Qisqa shaklda:

 M index.html

Bu yerda M ("Modified") o'ngdan ikkinchi ustunda turibdi β€” ya'ni o'zgarish Working Directory'da, hali staging'ga olinmagan. (Agar git add qilsangiz, M chapga, yashil ustunga ko'chadi.)

πŸ“Œ Diqqat bilan qarang: git status har safar pastda keyingi qadamni taklif qildi β€” "use git add", "use git restore". Bu xabarlarni o'qishni o'rgansangiz, Git sizning yo'lboshchingizga aylanadi. Yangi boshlovchilar ko'pincha xatolardan qo'rqadi; aslida git status deyarli har doim nima qilish kerakligini aytib turadi.

Tsikl yopiladi

Faylni yana saqlamoqchi bo'lsak, xuddi shu yo'lni takrorlaymiz: git add (modified β†’ staged) keyin git commit (staged β†’ committed). Mana shu β€” add va commit β€” kundalik ishingizning asosiy ritmi bo'ladi. Keyingi bobda aynan shu ikki buyruqni chuqurroq o'rganamiz.

Bir nechta fayl: status'ni o'qish mashqi

Real loyihada papkada bir nechta fayl bo'ladi va ular turli holatlarda turishi mumkin. Buni ko'rish uchun ikkita yangi fayl qo'shamiz va faqat bittasini staging'ga olamiz:

echo "body { color: navy; }" > style.css
echo "console.log('salom');" > app.js
git add style.css
git status -s
 M index.html
A  style.css
?? app.js

Endi qisqa status'ni "o'qiy olamiz" β€” har bir belgi nimani anglatishini:

Belgi Holat Ma'nosi
?? untracked app.js β€” yangi, Git hali bilmaydi
A (chapda A) staged style.css β€” yangi fayl, commitga tayyor
M (o'ngda M) modified index.html β€” kuzatiladi, o'zgargan, lekin hali staging'da emas

πŸ’‘ Ikki ustunni shunday tushuning: chap ustun β€” Staging Area holati (Repository bilan farqi), o'ng ustun β€” Working Directory holati (Staging bilan farqi). Bitta fayl ikkala ustunda ham belgi olishi mumkin β€” masalan add qilib, keyin yana tahrirlasangiz MM chiqadi. Hozircha buni eslab qolish shart emas; muhimi β€” git status (yoki -s) har doim haqiqatni ko'rsatadi.


Endi sizda repozitoriy bor, uch zonani tushunasiz va git status'ni o'qiy olasiz. Keyingi bobda add va commit'ni chuqurroq, turli ssenariylarda mashq qilamiz.

3-bob mashqlari

Quyidagi mashqlarni tartib bilan, o'z kompyuteringizda bajaring. Har bir qadamdan keyin git status yozib, natijani o'qishni unutmang. Yechimlar berilmagan β€” maqsad o'zingiz qilib o'rganish.

  1. mashq-loyiha nomli yangi bo'sh papka yarating va terminalda uning ichiga kiring.
  2. Papkani repozitoriyga aylantiring va Git bergan xabarni o'qing: u qayerda repozitoriy yaratganini ko'ring.
  3. ls -a bilan papkadagi yashirin .git katalogini toping. U boshqa fayllardan nimasi bilan farq qiladi?
  4. .git katalogi ichini ro'yxatlang (ls .git) va HEAD, config, objects, refs elementlarini toping.
  5. git status yozing. Hali birorta fayl yo'q β€” Git nima deb javob beradi?
  6. O'z so'zingiz bilan (daftarga yoki matn faylga) uch zonaning har birini bittadan jumla bilan tushuntiring: Working Directory, Staging Area, Repository.
  7. README.txt degan fayl yarating va ichiga bir qator matn yozing. git status bilan uning untracked ekanini tasdiqlang.
  8. git status -s (qisqa shakl) yozing va README.txt oldida ?? belgisini ko'ring β€” bu nimani anglatadi?
  9. git add README.txt bilan faylni Staging Area'ga oling. git status'da fayl endi qaysi ro'yxatga o'tdi?
  10. git status -s yozing: belgi ??'dan nimaga o'zgardi va u qaysi ustunda turibdi?
  11. git commit -m "..." bilan birinchi commit'ni yarating (izohni o'zingiz tanlang). Keyin git status "working tree clean" deyaptimi?
  12. git log --oneline bilan commit'ingizni ko'ring. Chapdagi qisqa hash β€” bu nima?
  13. README.txt'ni tahrirlang (yangi qator qo'shing) va saqlang. git status faylni endi qaysi holatda ko'rsatyapti β€” untracked'mi yoki modified'mi? Nima uchun farqi bor?
  14. 13-mashqdagi o'zgarishni git add keyin git commit bilan saqlang. Endi tsikl to'liq aylandi β€” git log --oneline'da nechta commit bor?
  15. Ikkita yangi fayl yarating: style.css va script.js. Ulardan faqat bittasini git add qiling.
  16. git status -s yozing va uchta holatni bir vaqtda kuzating: bittasi staged, bittasi untracked, agar README.txt'ni yana tahrirlagan bo'lsangiz β€” modified. Har bir belgini izohlang.
  17. Qolgan faylni ham git add qiling, hammasini bitta commit bilan saqlang. Commit izohida nima o'zgarganini aniq yozing.
  18. git status har bir holatda pastda qanday maslahat ("use git ...") berganini eslang. Nega bu xabarlarni o'qish foydali?
  19. Tajriba (ehtiyot bo'ling): mashq-loyiha ichida .git ni o'chirib ko'ring, keyin git status yozing β€” Git nima deydi? Bu nimani isbotlaydi? (So'ng papkani butunlay o'chirib tashlashingiz mumkin.)
  20. Daftaringizga faylning to'liq hayot siklini chizing: untracked β†’ (qaysi buyruq?) β†’ staged β†’ (qaysi buyruq?) β†’ committed β†’ (nima qilsangiz?) β†’ modified. Har bir strelka ustiga to'g'ri buyruqni yozing.