4.1-bob: Git asoslari (init, add, commit, status, log)
4-QISM — Git va hamkorlik · 1-mavzu
1. Kirish va motivatsiya
Kod yozishni 0–3 qismlarda chuqur o'rgandik. Endi uni boshqarishni — versiyalash, tarix, hamkorlikni — o'rganamiz. Git — har bir professional dasturchining kunlik quroli: bironta jiddiy loyiha Git'siz yozilmaydi.
Tasavvur qiling: kursovoy ishingizni yozayotibsiz, loyiha.docx, loyiha_final.docx, loyiha_final_v2.docx, loyiha_final_HAQIQIY.docx... Bu — versiyalashning eng yomon usuli. Git bu betartiblikni hal qiladi: u kodingizning har bir holatini (snapshot) saqlaydi, kim nimani o'zgartirganini biladi, istalgan eski holatga qaytarish va bir necha dasturchining ishini birlashtirishga imkon beradi.
O'xshatish: Git — kodingizning vaqt mashinasi + kuzatuv kamerasi. Har "commit" — vaqtning bir nuqtasidagi suratga olish (snapshot). Istalgan vaqtga qaytishingiz, "kim nimani o'zgartirgan?" deb ko'rishingiz, bir necha versiyani solishtirishingiz mumkin. Bironta o'zgarish yo'qolmaydi.
Nega muhim?
- Har bir loyiha Git bilan (kompaniyada, ochiq kod, portfolio).
- Hamkorlik — bir necha dasturchi bir loyihada 4.3-bob.
- Xavfsizlik — eski holatga qaytish; xato qilsangiz, yo'qotmaysiz.
- CI/CD 10.5-bob, GitHub 4.3-bob, deploy — hammasi Git'ga tayanadi.
2. Nazariya — chuqur tushuntirish
2.1. Version Control System (VCS) nima?
VCS (versiya nazorat tizimi) — kod o'zgarishlarini vaqt bo'yicha kuzatadigan tizim. Git — eng mashhur VCS (Linus Torvalds, Linux yaratuvchisi tomonidan yaratilgan — 0.2).
Git taqsimlangan (distributed): har bir dasturchida loyihaning to'liq nusxasi (tarix bilan) bor. Bu — ishonchli (markaziy server o'chsa ham, har kimda to'liq nusxa) va tez (ko'p amal lokal — 0.4).
Git vs GitHub: Git — vositaning o'zi (terminalingizda — 0.3). GitHub — Git loyihalarini saqlash va hamkorlik qiladigan bulut xizmat 4.3-bob. Git'ni GitHub'siz ham ishlatish mumkin.
2.2. Git'ning uch hududi (three areas) — eng muhim model
Git'ni tushunishning kaliti — fayl uch hudud orqali o'tishi:
Working Directory Staging Area Repository (.git)
(ish papkasi) (tayyorlash) (commit'lar tarixi)
│ │ │
o'zgartirasiz git add bilan git commit bilan
"tayyor" deysiz doimiy saqlaysiz- Working Directory — joriy fayllaring (0.2: fayl tizimi); o'zgartirasiz.
- Staging Area (index) — keyingi commit'ga kiritiladigan o'zgarishlar to'plami (
git add). - Repository (
.git) — commit'lar tarixi (doimiy snapshot'lar —git commit).
Nega staging area? U sizga qaysi o'zgarishlarni bitta commit'ga kiritishni tanlash imkonini beradi. 10 fayl o'zgartirib, faqat 3 tasini bitta mantiqiy commit'ga qo'shishingiz mumkin. Bu — toza, mazmunli tarix uchun.
2.3. Commit nima?
Commit — loyihaning bir paytdagi snapshoti (holati) + metadata (kim, qachon, nima uchun). Har commit'ning noyob IDsi (hash — 3.5 g'oyasi) bor:
commit a3f5b2c... (hash — noyob ID)
Author: Ali <ali@mail.uz>
Date: 2026-06-21
Message: "Login formasi qo'shildi"
kodning aynan o'sha paytdagi to'liq holatiCommit'lar zanjir hosil qiladi (har biri oldingisiga ishora — 3.3: linked list g'oyasi) loyiha tarixi.
2.4. Git'ni sozlash (birinchi marta)
Git o'rnatilgach (0.7: Git Bash bilan birga keladi), o'zingizni tanishtiring (har commit'ga yoziladi):
git config --global user.name "Ali Valiyev"
git config --global user.email "ali@mail.uz"
git config --global init.defaultBranch main # default branch nomi (4.2)
git config --list # sozlamalarni ko'rish2.5. Repository yaratish — git init
mkdir loyiham && cd loyiham # papka (0.3)
git init # shu papkani Git repository qiladi (.git yaratiladi)
# "Initialized empty Git repository..."git init papkada yashirin .git papkasini (0.2: yashirin fayl) yaratadi — butun tarix shu yerda saqlanadi.
2.6. Asosiy ish sikli (workflow)
Kundalik Git sikli — to'rt amal:
1. o'zgartir (kod yoz)
2. git status — nima o'zgardi?
3. git add — o'zgarishlarni staging'ga
4. git commit — doimiy saqla
(takrorlanadi)2.7. git status — holatni ko'rish
git status
# Qaysi fayllar o'zgargan, staging'da, yoki kuzatilmagan (untracked) ekanini ko'rsatadiFayl holatlari: untracked (Git bilmaydi), modified (o'zgargan), staged (commit'ga tayyor), committed (saqlangan).
2.8. git add va git commit
git add index.js # bitta faylni staging'ga
git add src/ # papkani (0.3)
git add . # BARCHA o'zgarishlarni (ehtiyot — 4.5: .gitignore)
git commit -m "Login formasi qo'shildi" # staging'dagilarni saqla + xabar
git commit -am "Tuzatish" # add + commit birga (faqat tracked fayllar)Commit xabari (message) muhim: "nima o'zgardi va nega" ni aniq yozing. Yomon: "tuzatish", "asd". Yaxshi: "Login formasiga email validatsiyasi qo'shildi". Bu — keyin tarixni o'qishni osonlashtiradi (4.5: conventional commits).
2.9. git log — tarixni ko'rish
git log # to'liq tarix (commit'lar)
git log --oneline # qisqa (bir qator har commit)
git log --oneline --graph # vizual (branch'lar bilan — 4.2)
git log -n 5 # oxirgi 5 commit
git show a3f5b2c # bitta commit tafsiloti2.10. O'zgarishlarni ko'rish va bekor qilish
git diff # working directory o'zgarishlari (staging'siz)
git diff --staged # staging'dagi o'zgarishlar
git restore index.js # faylni oxirgi commit holatiga qaytar (o'zgarishni bekor)
git restore --staged index.js # staging'dan olib tashlash (o'zgarish qoladi)
git restoreo'zgarishni o'chiradi (commit qilinmagan). Ehtiyot bo'ling — saqlanmagan ish yo'qoladi (0.3:rmkabi).
2.11. .git ichida nima bor? (obyekt modeli)
.git papkasi — Git'ning "miyasi". Git har bir narsani obyekt sifatida saqlaydi, har obyektning noyob IDsi — kontenti asosida hisoblangan SHA-1 hash (40 belgili o'n oltilik son — 3.5 g'oyasi: bir xil kontent bir xil hash). Uch asosiy obyekt turi bor:
blob — faylning MAZMUNI (fayl nomi emas, faqat baytlar)
tree — papka: qaysi blob/tree qaysi nom bilan (papka tuzilishi — 0.2)
commit — snapshot: bitta tree + ota-commit(lar) + metadata (kim/qachon/xabar) commit a3f5b2c
│
└──▶ tree 9d2c1f (loyihaning ildiz papkasi)
├──▶ blob e1a4 "index.js" (fayl mazmuni)
└──▶ tree 7b0c "src/"
└──▶ blob 4f9d "app.js"Demak commit — to'liq snapshotga ishora (tree orqali), tarix esa commit'lar zanjiri (har biri ota-commit'iga bog'langan — 3.3: linked list).
git cat-file -t a3f5b2c # obyekt turi (commit/tree/blob)
git cat-file -p a3f5b2c # obyekt mazmuni (commit ichida tree va parent hash'lari)
git hash-object index.js # faylning blob hash'ini hisoblashNega SHA-1 hash? Hash kontentdan kelib chiqadi: bitta bayt o'zgarsa, hash butunlay o'zgaradi. Shu sabab Git butunligini kafolatlaydi — tarix buzilsa, hash mos kelmaydi va Git buni sezadi. Hash — "barmoq izi" (0.4: aynan bir kontentning yagona identifikatori).
Faqat tushunish uchun:
cat-file,hash-object— kundalik ishda kerak emas (ichki "santexnika"). Lekin.gitqanday ishlashini bilsangiz,commit,reset,checkoutnima qilayotganini chuqur tushunasiz.
2.12. HEAD — "hozir qayerdaman?"
HEAD — siz hozir turgan commit'ga ishora qiluvchi maxsus ko'rsatkich (pointer — 3.3 g'oyasi). Odatda HEAD branch nomiga (masalan main), branch esa oxirgi commit'ga ishora qiladi.
HEAD ──▶ main ──▶ c3 (oxirgi commit)
│
▼
c2 ──▶ c1 (tarix orqaga)git commit qilganingizda HEAD (va u ko'rsatayotgan branch) yangi commit'ga siljiydi. Ko'p Git buyrug'i HEAD'ga nisbatan ishlaydi:
git log HEAD # joriy commit'dan orqaga tarix
git show HEAD # joriy commit tafsiloti
git show HEAD~1 # bitta orqadagi commit (HEAD~2 — ikkita orqada)
HEAD~n— HEAD'dannqadam orqadagi commit. Bu — eski holatlarga murojaat qilishning qulay yo'li (reset/restore'da ishlatiladi — 2.13).
2.13. git reset — HEAD'ni ko'chirish (soft / mixed / hard)
git reset HEAD'ni boshqa commit'ga ko'chiradi va (rejimga qarab) staging hamda working directory'ni unga moslaydi. Uch rejim — uch hudud 2.2-bob bilan bog'liq:
rejim repository(HEAD) staging working dir
--soft ko'chadi tegmaydi tegmaydi
--mixed (default) ko'chadi tozalanadi tegmaydi
--hard ko'chadi tozalanadi TOZALANADI git reset --soft HEAD~1 # oxirgi commit'ni "yech", o'zgarishlar staging'da qoladi
git reset HEAD~1 # (mixed) commit'ni yech, o'zgarishlar working'da qoladi
git reset --hard HEAD~1 # oxirgi commit'ni VA o'zgarishlarni butunlay o'chir
git reset HEAD index.js # faylni staging'dan ol (restore --staged bilan bir xil)
--hardxavfli: commit qilinmagan ishingizni qaytarib bo'lmaydigan tarzda o'chiradi (0.3:rmkabi). Shubha bo'lsa--softyoki--mixedishlating — ular o'zgarishni saqlaydi.
Foydali holat: "Oxirgi commit'ni biroz to'g'rilamoqchiman"
git reset --soft HEAD~1, fayllarni tahrirlang, qayta commit qiling. Push qilingan commit'ni reset qilmang (4.3: tarix buziladi — amend bilan bir xil ogohlantirish).
2.14. git checkout va git stash
git checkout — eski, ko'p maqsadli buyruq (branch o'tish — 4.2, faylni qaytarish, commit'ni ko'rish). Hozirgi Git uni ikki aniqroq buyruqqa ajratdi: git switch (branch — 4.2) va git restore (fayl — 2.10). Eski loyihalarda hali checkout ko'p uchraydi:
git checkout main # main branch'ga o'tish (= git switch main — 4.2)
git checkout a3f5b2c # commit'ni "ko'rish" (detached HEAD — vaqtincha)
git checkout -- index.js # faylni oxirgi commit holatiga (= git restore — 2.10)git stash — yarim ishni commit qilmasdan vaqtincha chetga qo'yish. Boshqa shoshilinch ishga o'tish kerak bo'lsa qulay:
git stash # joriy o'zgarishlarni "yashir" (working toza bo'ladi)
git stash list # yashirilgan to'plamlar ro'yxati
git stash pop # oxirgi stash'ni qaytar (va ro'yxatdan o'chir)
git stash apply # qaytar, lekin ro'yxatda qoldirStash qachon? "Hozir feature ustida ishlayapman, lekin shoshilinch tuzatish kerak"
git stashtuzatinggit stash pop. Ish yo'qolmaydi, commit tarixi ham iflos bo'lmaydi.
3. Sintaksis — tez ma'lumotnoma
# Sozlash (bir marta)
git config --global user.name "..." git config --global user.email "..."
# Boshlash
git init # repository yaratish
# Kundalik sikl
git status # holat
git add <fayl> / . # staging'ga
git commit -m "xabar" # saqlash
git log --oneline # tarix
# Ko'rish/bekor qilish
git diff git restore <fayl> git show <hash>
# Orqaga qaytarish / vaqtincha saqlash
git reset --soft HEAD~1 # commit'ni yech (o'zgarish staging'da)
git reset --hard HEAD~1 # commit + o'zgarishni o'chir
git stash / git stash pop # yarim ishni vaqtincha chetga qo'yish/qaytarish4. Batafsil amaliy namunalar
Misol 1 — Yangi loyiha boshlash (to'liq sikl — 2.5–2.8)
mkdir todo-app && cd todo-app # papka (0.3)
git init # repository
echo "# Todo App" > README.md # fayl yaratish (0.3)
git status # README.md — untracked (qizil)
git add README.md # staging'ga
git status # README.md — staged (yashil)
git commit -m "Loyiha boshlandi: README qo'shildi"
git log --oneline # "a3f5b2c Loyiha boshlandi..."Misol 2 — O'zgartirish va commit (2.6–2.9)
echo "console.log('Salom')" > index.js
git add index.js
git commit -m "index.js qo'shildi"
# index.js'ni o'zgartiramiz
echo "console.log('Dunyo')" >> index.js
git status # index.js — modified
git diff # nima o'zgarganini ko'rsatadi (+/- qatorlar)
git add index.js
git commit -m "Salomlashuv yangilandi"
git log --oneline # 3 commit ko'rinadiMisol 3 — Tanlab commit qilish (staging area kuchi — 2.2)
# Uch fayl o'zgardi, lekin ikki ALOHIDA mantiqiy commit qilamiz
git add login.js auth.js # faqat auth bilan bog'liqlar
git commit -m "Autentifikatsiya logikasi qo'shildi"
git add styles.css # alohida — stil
git commit -m "Login sahifa stillari"
# Natija: toza, mantiqiy tarix (har commit — bitta maqsad)Misol 4 — Xatoni bekor qilish (2.10)
# Noto'g'ri o'zgartirdik, commit qilmadik
git restore index.js # oxirgi commit holatiga qaytar
# Staging'ga qo'shdik, lekin commit qilmadik
git add index.js
git restore --staged index.js # staging'dan ol (o'zgarish working'da qoladi)
# Oxirgi commit xabarini tuzatish
git commit --amend -m "To'g'ri xabar" # oxirgi commit'ni qayta yoz5. To'g'ri va noto'g'ri holatlar
1) Mazmunsiz commit xabari
# keyin hech narsa tushunarsiz
git commit -m "tuzatish"
git commit -m "asd"
# aniq: nima va nega
git commit -m "Login formasiga email validatsiyasi qo'shildi"2) Hamma narsani bitta katta commit
# 50 fayl, har xil maqsad — bitta commit (tarix o'qib bo'lmaydi)
git add . && git commit -m "ko'p o'zgarish"
# mantiqiy, kichik commit'lar (har biri bitta maqsad — Misol 3)3) Keraksiz fayllarni commit qilish
# node_modules, .env, .log — git'ga (0.2, 0.7)
git add .
# .gitignore bilan istisno (4.5)4) Tez-tez commit qilmaslik
kun oxirida bitta ulkan commit — xato bo'lsa hammasi yo'qoladi
tez-tez, kichik commit'lar — har mantiqiy bosqichda6. Keng tarqalgan xatolar va yechimlari
Xato 1 — fatal: not a git repository
Sababi: git init qilinmagan papkada git buyrug'i 2.5-bob. Yechimi: git init; yoki to'g'ri papkada ekaningizni tekshiring (pwd — 0.3).
Xato 2 — Please tell me who you are
Sababi: user.name/user.email sozlanmagan 2.4-bob. Yechimi: git config --global user.name/email.
Xato 3 — nothing to commit, working tree clean
Sababi: o'zgarish yo'q yoki git add qilinmagan 2.8-bob. Yechimi: git status bilan tekshiring; git add qiling.
Xato 4 — Noto'g'ri faylni commit qildim
Sababi: git add . keraksizni ham qo'shdi. Yechimi: git restore --staged <fayl> (commit'dan oldin); .gitignore 4.5-bob.
Xato 5 — Commit xabarini noto'g'ri yozdim
Sababi: imlo/mazmun xato. Yechimi: git commit --amend -m "yangi" (oxirgi commit — Misol 4). Push qilingan commit'ni amend qilmang 4.3-bob.
7. Integratsiya — bu mavzu stack'ning qayerida uchraydi
- Terminal 0.3-bob: Git — terminal buyruqlari.
- Fayl tizimi 0.2-bob:
.git,.gitignore— yashirin fayllar. - Branch/merge 4.2-bob: commit'lar ustiga quriladi.
- GitHub/PR 4.3-bob: lokal commit'lar remote'ga.
- CI/CD 10.5-bob: har push'da avtomatik test/deploy.
- Conventional commits 4.5-bob: commit xabar standarti.
- Har loyiha: birinchi qadam —
git init0.7-bob.
8. Eng yaxshi amaliyotlar (best practices)
- Tez-tez, kichik, mantiqiy commit'lar — har biri bitta maqsad (2.8, 4-holat).
- Aniq commit xabari — nima va nega (4.5: conventional).
git statusni tez-tez — commit'dan oldin nima staging'da ekanini ko'ring.git add .ehtiyot bilan —.gitignore4.5-bob bilan keraksizni istisno qiling.git diffbilan ko'rib commit qiling — nima saqlayotganingizni biling.- Loyiha boshida:
git init.gitignorebirinchi commit 0.7-bob. - Push qilingan commit'ni amend qilmang (tarix buziladi — 4.3).
.gitpapkasini o'chirmang/o'zgartirmang — butun tarix shunda.
9. Amaliy loyiha: "Git bilan Loyiha Tarixini Boshqarish"
Git asoslarini amalda mustahkamlash.
Maqsad
Git'ning uch hududini, ish siklini va asosiy buyruqlarni o'zlashtirib, toza, mazmunli commit tarixi yaratish.
Talablar (requirements)
- Sozlash:
user.name/user.email2.4-bob; tekshiring (git config --list). - Loyiha yarating: papka +
git init;.gitignore(node_modules, .env — 4.5'ga ko'prik). - Bosqichma-bosqich qurish: kichik web loyiha (HTML/CSS/JS — 1, 2-qism) yaratib, har mantiqiy bosqichda alohida commit (kamida 5 commit).
- Staging mashqi: bir vaqtda bir necha fayl o'zgartirib, ularni alohida mantiqiy commit'larga ajrating (Misol 3, 2.2).
- Tarix:
git log --oneline --graphbilan ko'ring;git showbilan bitta commit tafsiloti. - Bekor qilish:
git restorebilan o'zgarishni bekor;git restore --stagedbilan staging'dan oling (Misol 4). - Amend: oxirgi commit xabarini tuzating (Misol 4).
git diff: o'zgarishdan oldin/keyin farqni ko'ring.- Barcha commit xabarlari aniq va mazmunli bo'lsin 4.5-bob.
Maslahatlar (hint)
- Har commit — bitta maqsad (Misol 3).
git statusni har qadamda ishlating — holatni ko'ring..gitignoreni birinchi commit'dan oldin yarating.git log --oneline— tarixni qisqa ko'rish.git restoreo'zgarishni o'chiradi — ehtiyot 2.10-bob.- Commit xabari: "nima qo'shildi/o'zgardi" 4.5-bob.
"Tayyor" mezonlari (acceptance criteria)
- Git sozlangan (name/email).
-
git init+.gitignorebor. - Kamida 5 ta mantiqiy, mazmunli commit.
- Staging bilan o'zgarishlar alohida commit'larga ajratilgan.
-
git log --graphtoza tarix ko'rsatadi. -
restore/amendbilan bekor/tuzatish ishlatilgan. - node_modules/.env git'ga tushmagan.
Yechim kodi ataylab berilmagan — bu loyihani o'zingiz yozib ko'ring.
10. Xulosa va keyingi bobga ko'prik
Bu bobda kod boshqaruvining poydevorini — Git asoslarini o'rgandik:
- Git — taqsimlangan VCS (har kimda to'liq nusxa); GitHub — bulut xizmat 4.3-bob.
- Uch hudud: Working Directory Staging Area (
git add) Repository (git commit). - Commit — snapshot + metadata; noyob hash; zanjir hosil qiladi (tarix).
- Sikl: o'zgartir
git statusgit addgit commitgit log. git diff(farq),git restore(bekor — ehtiyot),git commit --amend(tuzatish)..gitichki: blob/tree/commit obyektlari, SHA-1 hash; HEAD — joriy commit ko'rsatkichi.git reset(soft/mixed/hard — HEAD'ni ko'chirish),git stash(yarim ishni vaqtincha saqlash),git checkout(eski ko'p maqsadli buyruq).- Best: tez-tez, kichik, mazmunli commit'lar;
.gitignore.
Keyingi bob — 4.2-bob: Branch, merge, rebase, conflict yechish. Asosiy siklni bildik; endi Git'ning eng kuchli imkoniyatini — **branch (tarmoq)**ni o'rganamiz. Branch bilan asosiy koddan ajralib, yangi feature ustida xavfsiz ishlash, keyin uni qaytarib birlashtirish (merge/rebase) — hamkorlik va parallel ishning asosi.
Foydalanilgan rasmiy/ishonchli manbalar
- git-scm.com — Git rasmiy hujjatlari (init, add, commit, status, log)
- Atlassian Git Tutorial — Git asoslari, uch hudud modeli
- Pro Git kitobi — version control tushunchalari
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!