Working Directory, Staging Area, Repository — uchala zona va farqi

~15 daq · Git · Git Asoslari

Muammodan boshlaylik

Bir kunda siz 5 ta faylni o'zgartirdingiz:

  • login.js — login xatosini tuzatdingiz
  • style.css — tugma rangini o'zgartirdingiz
  • config.js — debug uchun vaqtincha console.log qo'shdingiz
  • savat.js va savat.css — yangi savat funksiyasini yarim yozdingiz

Endi commit qilmoqchisiz. Lekin bularning hammasini bitta "turli o'zgarishlar" commit iga tiqish — yomon: keyin tarixda nima nima uchun o'zgarganini topib bo'lmaydi. Kerak — faqat login tuzatishini bir commit ga, rangni boshqasiga, savatni esa tugagandan keyin.

Git buning uchun staging area ni o'ylab topgan. Uni tushunish — Git ni tushunishning kaliti.


Uchta zona

 Working Directory        Staging Area           Repository
  (ishchi papka)          (tayyorlash)           (.git — tarix)
 ┌──────────────┐       ┌──────────────┐       ┌──────────────┐
 │              │       │              │       │  ●──●──●     │
 │  Fayllar —   │ ────→ │ Keyingi      │ ────→ │  commitlar   │
 │  siz ko'rib  │  add  │ commit ga    │commit │  (doimiy)    │
 │  tahrirlaysiz│       │ kiradiganlar │       │              │
 └──────────────┘       └──────────────┘       └──────────────┘
         ↑                                             │
         └────────────── checkout / restore ───────────┘

1. Working Directory — ishchi papka

Siz ko'radigan va muharrirda tahrirlaydigan fayllar. Bu yerdagi o'zgarishlar Git uchun hali hech narsa emas — faqat "o'zgargan" deb belgilanadi.

2. Staging Area — tayyorlash zonasi

Keyingi commit ga nima kirishini tanlash joyi. Rasmiy nomi — index (.git/index fayli). git add faylning joriy holatini shu yerga qo'yadi.

Analogiya: pochta bo'limidagi quti. Siz xonadagi narsalardan (working directory) faqat jo'natiladiganlarini qutiga solasiz (staging), keyin qutini yopib jo'natasiz (commit).

3. Repository — tarix

git commit staging dagi hamma narsani doimiy surat sifatida tarixga yozadi. Commit qilingan narsa — deyarli yo'qolmaydi (31-dars).


Fayl holatlari

 Untracked ──add──→ Staged ──commit──→ Unmodified
                      ↑                    │
                      │                 tahrirlash
                     add                   │
                      │                    ▼
                      └────────────── Modified
Holat Ma'nosi
Untracked Yangi fayl — Git uni hali kuzatmaydi
Modified Kuzatiladigan fayl, oxirgi commit dan keyin o'zgargan
Staged O'zgarish keyingi commit ga tayyorlangan
Unmodified (committed) Oxirgi commit bilan bir xil

Amalda ko'ramiz

mkdir zona-sinov && cd zona-sinov
git init
echo "<h1>Salom</h1>" > index.html
git status
On branch main

No commits yet

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

Untracked — Git faylni ko'radi, lekin kuzatmaydi.

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

Staged — keyingi commit ga tayyor.

git commit -m "Bosh sahifa qo'shildi"
git status
nothing to commit, working tree clean

Unmodified — hammasi tarixda, o'zgarish yo'q.

echo "<p>Xush kelibsiz</p>" >> index.html
git status
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

Modified — o'zgargan, lekin staging da emas.


Muhim nozik jihat: add — surat oladi

echo "1-qator" > fayl.txt
git add fayl.txt               # staging ga "1-qator" holati tushdi
echo "2-qator" >> fayl.txt     # faylni yana o'zgartirdik
git status
Changes to be committed:
        new file:   fayl.txt

Changes not staged for commit:
        modified:   fayl.txt

Bitta fayl — ikki joyda! Staging da — add paytidagi versiya ("1-qator"). Working directory da — yangisi ("1-qator" + "2-qator"). Hozir commit qilsangiz — faqat "1-qator" kiradi.

git add — "bu faylni kuzat" emas, "faylning hozirgi holatini keyingi commit ga qo'y". O'zgartirgandan keyin yana add kerak.


Muammoni hal qilamiz

Darsning boshidagi vaziyat:

git add login.js
git commit -m "Login: bo'sh parol bilan kirish xatosi tuzatildi"

git add style.css
git commit -m "Asosiy tugma rangi yashilga o'zgartirildi"

# config.js — commit qilmaymiz (debug), savat — hali tugamagan
git status
Changes not staged for commit:
        modified:   config.js
Untracked files:
        savat.css
        savat.js

Ikki toza, tushunarli commit. Qolganlar — kutib turibdi. Staging area aynan shu uchun.

Bitta faylning faqat bir qismini staging ga qo'yish ham mumkin — git add -p (7-dars).


Zonalar orasida harakat — xarita

Qayerdan → qayerga Buyruq
Working → Staging git add fayl
Staging → Repository git commit
Staging → Working (unstage) git restore --staged fayl
O'zgarishlarni bekor qilish (Working) git restore fayl ⚠️
Working ↔ Staging farqi git diff
Staging ↔ oxirgi commit farqi git diff --staged

git status har doim keyingi qadamni o'zi maslahat beradi — (use "git ..." to ...) qatorlarini o'qing.

[!WARNING] git restore fayl — working directory dagi commit qilinmagan o'zgarishlarni butunlay o'chiradi. Ular hech qayerda saqlanmagan — tiklab bo'lmaydi.


Nima uchun shunday?

Nima uchun Git staging area ni qo'shgan — boshqa tizimlarda (va ko'p GUI larda) to'g'ridan-to'g'ri "commit" qilinadi-ku?

Chunki yaxshi tarix — mantiqiy o'zgarishlardan iborat, ish kunining tasodifiy "suratlari"dan emas. Real ishda siz bir vaqtda bir nechta narsani o'zgartirasiz. Staging area sizga ish tartibini emas, natija tartibini yozish imkonini beradi: avval nima qilganingizdan qat'i nazar, tarixga "1 commit = 1 mantiqiy o'zgarish" sifatida tushadi. Bunday tarixni o'qish, ko'rib chiqish (code review), xatoni topish (bisect, 30-dars) va bitta o'zgarishni bekor qilish (revert, 28-dars) ancha oson.


Xulosa

Eslab qoling:

  • Working Directory — siz tahrirlaydigan fayllar
  • Staging Area (index) — keyingi commit ga nima kirishi
  • Repository — commitlar tarixi (.git)
  • add → staging; commit → tarix
  • Holatlar: untracked, modified, staged, unmodified
  • add — faylning o'sha paytdagi holatini oladi; keyin o'zgartirsangiz — yana add
  • git status — doim qayerda ekaningizni va keyingi qadamni ko'rsatadi
  • 1 commit = 1 mantiqiy o'zgarish

Keyingi dars

7-dars: git add — fayllarni staging ga qo'shish, . va fayl nomi farqi