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 initnima qilishini va u yaratgan yashirin.gitkatalogining 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 turadigangit statusbuyrug'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 β "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:
Natija:
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:
-a ("all" β hammasi) yashirin fayllarni ham ko'rsatadi. Natijada .git papkasini ko'rasiz. Uning ichiga ham qarab qo'yaylik:
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 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.
-
Working Directory (ishchi katalog) β bu siz ko'rib, tahrir qiladigan oddiy papka. Hozir
index.htmlyozsangiz, u shu yerda paydo bo'ladi. Bu yerda hamma narsa "jonli" β istalgancha o'zgartirasiz. -
Staging Area (tayyorlash maydoni;
indexdeb 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. -
Repository (
.gitkatalogi) β 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".
1-holat: untracked (kuzatilmaydigan)¶
Papkaga yangi fayl yaratamiz:
π echo "..." > fayl β qavs ichidagi matnni faylga yozadi. Albatta, faylni oddiy matn muharririda ham yaratishingiz mumkin β natija bir xil.
Endi holatni so'raymiz:
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:
?? β "bu fayl haqida Git hech narsa bilmaydi" degani (untracked).
2-holat: staged (tayyorlangan)¶
Endi faylni Staging Area'ga qo'shamiz:
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 ("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:
π -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:
"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:
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:
π 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:
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
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.
mashq-loyihanomli yangi bo'sh papka yarating va terminalda uning ichiga kiring.- Papkani repozitoriyga aylantiring va Git bergan xabarni o'qing: u qayerda repozitoriy yaratganini ko'ring.
ls -abilan papkadagi yashirin.gitkatalogini toping. U boshqa fayllardan nimasi bilan farq qiladi?.gitkatalogi ichini ro'yxatlang (ls .git) vaHEAD,config,objects,refselementlarini toping.git statusyozing. Hali birorta fayl yo'q β Git nima deb javob beradi?- O'z so'zingiz bilan (daftarga yoki matn faylga) uch zonaning har birini bittadan jumla bilan tushuntiring: Working Directory, Staging Area, Repository.
README.txtdegan fayl yarating va ichiga bir qator matn yozing.git statusbilan uning untracked ekanini tasdiqlang.git status -s(qisqa shakl) yozing vaREADME.txtoldida??belgisini ko'ring β bu nimani anglatadi?git add README.txtbilan faylni Staging Area'ga oling.git status'da fayl endi qaysi ro'yxatga o'tdi?git status -syozing: belgi??'dan nimaga o'zgardi va u qaysi ustunda turibdi?git commit -m "..."bilan birinchi commit'ni yarating (izohni o'zingiz tanlang). Keyingit status"working tree clean" deyaptimi?git log --onelinebilan commit'ingizni ko'ring. Chapdagi qisqa hash β bu nima?README.txt'ni tahrirlang (yangi qator qo'shing) va saqlang.git statusfaylni endi qaysi holatda ko'rsatyapti β untracked'mi yoki modified'mi? Nima uchun farqi bor?- 13-mashqdagi o'zgarishni
git addkeyingit commitbilan saqlang. Endi tsikl to'liq aylandi βgit log --oneline'da nechta commit bor? - Ikkita yangi fayl yarating:
style.cssvascript.js. Ulardan faqat bittasinigit addqiling. git status -syozing va uchta holatni bir vaqtda kuzating: bittasi staged, bittasi untracked, agarREADME.txt'ni yana tahrirlagan bo'lsangiz β modified. Har bir belgini izohlang.- Qolgan faylni ham
git addqiling, hammasini bitta commit bilan saqlang. Commit izohida nima o'zgarganini aniq yozing. git statushar bir holatda pastda qanday maslahat ("use git ...") berganini eslang. Nega bu xabarlarni o'qish foydali?- Tajriba (ehtiyot bo'ling):
mashq-loyihaichida.gitni o'chirib ko'ring, keyingit statusyozing β Git nima deydi? Bu nimani isbotlaydi? (So'ng papkani butunlay o'chirib tashlashingiz mumkin.) - 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.