Working Directory, Staging Area, Repository — uchala zona va farqi
Muammodan boshlaylik
Bir kunda siz 5 ta faylni o'zgartirdingiz:
login.js— login xatosini tuzatdingizstyle.css— tugma rangini o'zgartirdingizconfig.js— debug uchun vaqtinchaconsole.logqo'shdingizsavat.jsvasavat.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 — yanaaddgit 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