Repository — git init, loyiha tuzilishi, .git papkasi ichida nima bor
Muammodan boshlaylik
Sizda loyiha papkasi bor — HTML, CSS, JS fayllar. Git o'rnatilgan va sozlangan. Lekin Git hali bu papka haqida hech narsa bilmaydi: fayllarni kuzatmaydi, tarix yozmaydi.
git status
fatal: not a git repository (or any of the parent directories): .git
Git ga "bu papkani kuzat" deyish kerak. Shu bilan oddiy papka repozitoriyga aylanadi.
Repository nima?
Repository (repozitoriy, qisqacha "repo") — Git kuzatadigan loyiha papkasi va uning butun tarixi.
Oddiy papka va repozitoriyning yagona farqi — ichidagi yashirin .git papkasi. Butun tarix, barcha commitlar, branch lar, sozlamalar — hammasi shu yerda.
dokon/ ← ishchi papka (siz ko'radigan fayllar)
├── .git/ ← repozitoriy (Git ning "miyasi")
├── index.html
├── style.css
└── app.js
git init — repozitoriy yaratish
mkdir dokon
cd dokon
git init
Initialized empty Git repository in /home/otabek/dokon/.git/
Shu bilan hammasi. Endi:
git status
On branch main
No commits yet
nothing to commit (create/copy files and use "git add" to track)
Mavjud loyihada ham xuddi shunday — papkaga kirib git init. Fayllar o'zgarmaydi, faqat .git qo'shiladi.
ls -la
drwxr-xr-x .git
[!WARNING]
git initni loyiha papkasida bajaring — uy papkangizda (~) yokiC:\Users\Ismda emas. Aks holda Git butun kompyuteringizdagi fayllarni "ko'radi" va har qanday papkadagit statusming-minglab fayl ko'rsatadi. Agar adashib shunday qilgan bo'lsangiz — o'sha joydagi.gitpapkasini o'chiring.
Mavjud repozitoriyni olish
Ikkinchi yo'l — GitHub dagi repozitoriyni nusxalash (git clone, 20-dars). Bunda .git tarix bilan birga keladi.
.git ichida nima bor?
ls .git
HEAD
config
description
hooks/
info/
objects/
refs/
| Element | Nima |
|---|---|
objects/ |
Barcha ma'lumotlar: fayl mazmunlari, papka tuzilmalari, commitlar — siqilgan holda |
refs/heads/ |
Branch lar: har biri — bitta fayl, ichida commit hash i |
refs/tags/ |
Teglar (36-dars) |
HEAD |
Hozir qaysi branch da ekaningiz |
config |
Shu repozitoriy sozlamalari (git config --local) |
hooks/ |
Avtomatik skriptlar (47-dars) |
index |
Staging area (6-dars) — birinchi git add dan keyin paydo bo'ladi |
cat .git/HEAD
ref: refs/heads/main
"Siz main branch dasiz". Birinchi commit dan keyin:
cat .git/refs/heads/main
a3f9c2b8e1d4f6a7b9c0d2e4f6a8b0c2d4e6f8a0
Branch — shunchaki commit hash i yozilgan 40 belgilik fayl. Shuning uchun Git da branch yaratish bir zumda (12-dars).
Git obyektlari
objects/ da to'rt turdagi obyekt saqlanadi:
commit ──→ tree ──→ blob (index.html mazmuni)
│ ├────→ blob (style.css mazmuni)
│ └────→ tree (src/) ──→ blob (app.js)
│
└─ ota commit ga havola
- blob — fayl mazmuni
- tree — papka: fayl nomlari va blob larga havolalar
- commit — tree ga havola + muallif + sana + xabar + ota commit
- tag — annotatsiyali teg
Har bir obyekt mazmunidan hisoblangan hash bilan saqlanadi. Ichini ko'rish:
git cat-file -p HEAD
tree 8f3d2a1...
parent 7b2e9c4...
author Otabek Hasanov <otabek@example.com> 1762421000 +0500
committer Otabek Hasanov <otabek@example.com> 1762421000 +0500
Login sahifasi qo'shildi
Bularni kundalik ishda bilish shart emas — lekin Git "sehrli" emasligini, oddiy fayllar ustida qurilganini tushunish muammolarni hal qilishda juda yordam beradi.
[!WARNING]
.gitpapkasini qo'lda o'zgartirmang va o'chirmang. O'chirsangiz — butun tarix yo'qoladi (fayllar qoladi, lekin Git ular haqida hech narsa bilmaydi). Yagona istisno — repozitoriyni ataylab "oddiy papka"ga qaytarish.
Tipik loyiha tuzilishi
dokon/
├── .git/ ← Git (avtomatik)
├── .gitignore ← kuzatilmaydigan fayllar (11-dars)
├── README.md ← loyiha tavsifi — GitHub da bosh sahifa
├── LICENSE ← litsenziya (ochiq loyihalar uchun)
├── package.json
├── src/
│ └── ...
└── public/
└── ...
README.md — har bir repozitoriyda bo'lishi kerak. Minimal:
# Dokon
Onlayn do'kon — Node.js va React.
## Ishga tushirish
npm install
npm run dev
Ichma-ich repozitoriylar — qilmang
loyihalar/ ← git init (xato!)
├── .git/
├── blog/
│ └── .git/ ← alohida repo
└── dokon/
└── .git/ ← alohida repo
Repo ichidagi repo — Git uchun chalkash holat (ichki repo fayllari kuzatilmaydi). Har bir loyiha — o'z mustaqil repozitoriysi. Haqiqatan bir loyiha ichida boshqasi kerak bo'lsa — submodule (45-dars).
Qaysi repozitoriy ichida ekaningizni bilish:
git rev-parse --show-toplevel
Nima uchun shunday?
Nima uchun Git butun tarixni loyiha ichidagi bitta .git papkasida saqlaydi — markaziy ma'lumotlar bazasida emas?
Chunki bu repozitoriyni to'liq mustaqil va ko'chma qiladi. Papkani boshqa joyga ko'chirsangiz, fleshkaga yozsangiz yoki arxivlasangiz — tarix u bilan birga ketadi. Hech qanday server, ro'yxatdan o'tish yoki o'rnatish kerak emas. Har bir clone — to'liq, mustaqil nusxa (1-dars: taqsimlangan tizim). Va hamma narsa oddiy fayllar bo'lgani uchun Git juda ishonchli: ma'lumotlar bazasi buzilishi kabi muammolar yo'q, hash lar esa har qanday buzilishni darhol aniqlaydi.
Xulosa
Eslab qoling:
- Repozitoriy — loyiha papkasi +
.git(tarix) git init— loyiha papkasida, uy papkada emas.git/objects— barcha ma'lumotlar;refs/heads— branch lar;HEAD— joriy branch- Branch — commit hash i yozilgan kichik fayl
- Obyektlar: blob (fayl), tree (papka), commit
.gitni qo'lda o'zgartirmang- Har bir loyihada —
README.md; repo ichida repo — yo'q
Keyingi dars
6-dars: Working Directory, Staging Area, Repository — uchala zona va farqi