Repository — git init, loyiha tuzilishi, .git papkasi ichida nima bor

~15 daq · Git · Git Asoslari

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 init ni loyiha papkasida bajaring — uy papkangizda (~) yoki C:\Users\Ism da emas. Aks holda Git butun kompyuteringizdagi fayllarni "ko'radi" va har qanday papkada git status ming-minglab fayl ko'rsatadi. Agar adashib shunday qilgan bo'lsangiz — o'sha joydagi .git papkasini 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] .git papkasini 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
  • .git ni 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