WisarWisar
Dasturlash kitobi/4-QISM — Git14 daqiqa

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:

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

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

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

bash
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'rish

2.5. Repository yaratish — git init

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

text
  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

bash
git status
# Qaysi fayllar o'zgargan, staging'da, yoki kuzatilmagan (untracked) ekanini ko'rsatadi

Fayl holatlari: untracked (Git bilmaydi), modified (o'zgargan), staged (commit'ga tayyor), committed (saqlangan).

2.8. git add va git commit

bash
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

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

2.10. O'zgarishlarni ko'rish va bekor qilish

bash
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 restore o'zgarishni o'chiradi (commit qilinmagan). Ehtiyot bo'ling — saqlanmagan ish yo'qoladi (0.3: rm kabi).

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:

text
  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)
text
  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).

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

Nega 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 .git qanday ishlashini bilsangiz, commit, reset, checkout nima 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.

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

bash
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'dan n qadam 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:

text
  rejim        repository(HEAD)   staging      working dir
  --soft           ko'chadi         tegmaydi      tegmaydi
  --mixed (default) ko'chadi        tozalanadi    tegmaydi
  --hard           ko'chadi         tozalanadi    TOZALANADI 
bash
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)

--hard xavfli: commit qilinmagan ishingizni qaytarib bo'lmaydigan tarzda o'chiradi (0.3: rm kabi). Shubha bo'lsa --soft yoki --mixed ishlating — 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:

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

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

Stash qachon? "Hozir feature ustida ishlayapman, lekin shoshilinch tuzatish kerak" git stash tuzating git stash pop. Ish yo'qolmaydi, commit tarixi ham iflos bo'lmaydi.


3. Sintaksis — tez ma'lumotnoma

bash
# 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/qaytarish

4. Batafsil amaliy namunalar

Misol 1 — Yangi loyiha boshlash (to'liq sikl — 2.5–2.8)

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

bash
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'rinadi

Misol 3 — Tanlab commit qilish (staging area kuchi — 2.2)

bash
# 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)

bash
# 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 yoz

5. To'g'ri va noto'g'ri holatlar

1) Mazmunsiz commit xabari

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

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

bash
#  node_modules, .env, .log — git'ga (0.2, 0.7)
git add .

#  .gitignore bilan istisno (4.5)

4) Tez-tez commit qilmaslik

text
 kun oxirida bitta ulkan commit — xato bo'lsa hammasi yo'qoladi
 tez-tez, kichik commit'lar — har mantiqiy bosqichda

6. 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 init 0.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 status ni tez-tez — commit'dan oldin nima staging'da ekanini ko'ring.
  • git add . ehtiyot bilan.gitignore 4.5-bob bilan keraksizni istisno qiling.
  • git diff bilan ko'rib commit qiling — nima saqlayotganingizni biling.
  • Loyiha boshida: git init .gitignore birinchi commit 0.7-bob.
  • Push qilingan commit'ni amend qilmang (tarix buziladi — 4.3).
  • .git papkasini 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)

  1. Sozlash: user.name/user.email 2.4-bob; tekshiring (git config --list).
  2. Loyiha yarating: papka + git init; .gitignore (node_modules, .env — 4.5'ga ko'prik).
  3. Bosqichma-bosqich qurish: kichik web loyiha (HTML/CSS/JS — 1, 2-qism) yaratib, har mantiqiy bosqichda alohida commit (kamida 5 commit).
  4. Staging mashqi: bir vaqtda bir necha fayl o'zgartirib, ularni alohida mantiqiy commit'larga ajrating (Misol 3, 2.2).
  5. Tarix: git log --oneline --graph bilan ko'ring; git show bilan bitta commit tafsiloti.
  6. Bekor qilish: git restore bilan o'zgarishni bekor; git restore --staged bilan staging'dan oling (Misol 4).
  7. Amend: oxirgi commit xabarini tuzating (Misol 4).
  8. git diff: o'zgarishdan oldin/keyin farqni ko'ring.
  9. Barcha commit xabarlari aniq va mazmunli bo'lsin 4.5-bob.

Maslahatlar (hint)

  • Har commit — bitta maqsad (Misol 3).
  • git status ni har qadamda ishlating — holatni ko'ring.
  • .gitignore ni birinchi commit'dan oldin yarating.
  • git log --oneline — tarixni qisqa ko'rish.
  • git restore o'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 + .gitignore bor.
  • Kamida 5 ta mantiqiy, mazmunli commit.
  • Staging bilan o'zgarishlar alohida commit'larga ajratilgan.
  • git log --graph toza tarix ko'rsatadi.
  • restore/amend bilan 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 status git add git commit git log.
  • git diff (farq), git restore (bekor — ehtiyot), git commit --amend (tuzatish).
  • .git ichki: 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!
4.1-bob: Git asoslari (init, add, commit, status, log) — Wisar