2025-09-15

Git bilan ishlash

Birinchi bo'lib git nima uchun kerak degan savolga javob bersak, Git bu projectlardagi kodlarni bir kod baseda versionlarga bo'lish, turli versiondagi kodlarni birlashtirish, qayta ishlash uchun ishlab chiqilgan vosita. Agar git bo'lmaganda versionlarni alohida papkalarda saqlashimiz kerak bo'lardi. Github esa shu kodlar saqlab turish hostingi halos, siz Githubsiz ham localda versionlar bilan ishlashiz mumkin.

Next.js

Repo'lar bilan ishlash

Post asosiy tushunchalar bo'lganligi uchun, uni yuklab olish, sozlash qismlarini o'tkazib yuboramiz.

Birinchi bo'lib git bilan ishlamoqchi bo'lgan kod papkamizda git init qilishimiz kerak, shunda biz gitdagi history, loglar va boshqa git xususiyatlarini ishlatishimiz mumkin.

$ git init
Initialized empty Git repository in /Users/neo/Desktop/l_git/.git/

bor o'zgarishlarni commitga qo'shish:

$ git add .
  • git add - bu qo'shish
  • . - o'zgartirilgan hamma o'zgarishni qo'shish
  • git add home.html - faqat o'zgarganni o'zini qo'shish

o'zgarishlarni nomlab guruhlash:

$ git commit -m "o'zgarishlar nima haqidaligi"
  • git commit - commit qilish
  • -m - message flag, undan keyin "" ichida commit uchun nom

bog'lamoqchi bo'lgan remote repository linki:

$ git remote add origin https://github.com/username/myproject.git
  • git remote - localni remote bilan boshlash
  • add origin - origin nomi bilan remote qo'shyapmiz, uni linki remote repository link

tanlangan branchga push qilish:

$ git push -u origin main
  • git push - remote serverga yuklash
  • -u - ushbu branchni remote dagi shunga nomlangan branch bilan bog‘lab qo‘y
  • origin main - remotedagi origindagi main branchga yukla, odatda main yoki master bo'ladi, asosiy branch

Shunday qilib birinchi remote repoga bog'landik, GH misolida

Branchlar bilan ishlash

Yangi branch ochish, unga o'tish va uni masofaviy repoga jo'natish:

$ git branch feature/auth
$ git switch feature/auth     # yoki: git checkout feature/auth
$ git switch -c fix/login     # yaratish + o'tish
$ git branch                   # hamma branchlar ro'yxati
$ git branch -a                # remote branchlar bilan
$ git push -u origin feature/auth   # yangi branchni remote'ga yuborish
$ git branch -d fix/login      # merge qilingandan so'ng o'chirish (local)
$ git push origin --delete fix/login  # remote branchni o'chirish

Commitlar bilan ishlash

Commit qilish tartibi va foydali flaglar:

$ git add .
$ git commit -m "login sahifasida xatoliklarni ko'rsatish"
 
# Oxirgi commit message'ini tuzatish (o'zgarish bo'lmasa ham mumkin)
$ git commit --amend -m "login: xatoliklarni ko'rsatish va validator"
 
# Staged'ni bekor qilish
$ git restore --staged src/pages/login.tsx
 
# Ishchi faylni oxirgi commit holatiga qaytarish (DIQQAT: o'zgarish yo'qoladi)
$ git restore src/pages/login.tsx
 
# Faqat tanlangan faylni add qilish
$ git add src/pages/login.tsx

  • Commit message'lari aniq va qisqa bo'lsin: scope: nima qildingiz
  • Bir commit = bir mantiqiy o'zgarish.
  • Husky yoki lint-staged bilan commitdan oldin tekshiruvlar ishlatish mumkin.
  • Kerak bo'lsa --no-verify bilan hook'lardan vaqtincha o'tib ketish mumkin.

Git log va tarix bilan ishlash

Tarixni ko'rish va tahlil qilish usullari:

$ git log                    # to'liq log
$ git log --oneline --graph --decorate --all
$ git show HEAD             # oxirgi commit tafsiloti
$ git show <commit_sha>     # ma'lum commit tafsiloti
$ git blame src/app.ts      # fayl satrlari bo'yicha kim/qaçon
$ git diff                   # staged bo'lmagan farqlar
$ git diff --staged          # staged farqlar
$ git reflog                 # HEAD harakatlari tarixi (qutqaruvchi)

Branchlarni merge qilish

Asosiy ikki yo'l bor: merge va rebase.

# merge: tarixga "merge commit" qo'shadi
$ git switch main
$ git pull --ff-only
$ git merge feature/auth
 
# rebase: feature tarixini main ustiga yozib chiqadi (toza tarix)
$ git switch feature/auth
$ git fetch origin
$ git rebase origin/main
# konflikt bo'lsa tuzating, so'ng davom eting
$ git rebase --continue
 
# Agar rebase yoki merge paytida bekor qilish kerak bo'lsa
$ git rebase --abort
$ git merge --abort
 
# Cherry-pick jarayonini ham to'xtatish mumkin
$ git cherry-pick --abort
 
# yakunda main'ga qo'shish
$ git switch main
$ git merge --ff-only feature/auth

  • Fast-forward mumkin bo'lsa uni afzal ko'ring (--ff-only).
  • Konfliktlarda VSCode yoki diff tool'laridan foydalaning.
  • Rebase qilgandan keyin remote'ga jo'natishda --force-with-lease ishlating.

Gitga qo'shilmaydigan fayl yoki jildlar

.gitignore fayli orqali keraksiz fayllarni inkor qilamiz:

# .gitignore misoli
node_modules/
.next/
dist/
.env
.env.local
*.log
*.DS_Store
$ echo "node_modules/\n.env\n.dist" >> .gitignore

GH multi accountlar, ssh

Bir nechta GitHub hisobidan foydalanish va SSH sozlash:

# Yangi SSH kalit yaratish (ish/shaхsiy uchun alohida)
$ ssh-keygen -t ed25519 -C "work-email@company.com" -f ~/.ssh/id_ed25519_work
$ ssh-keygen -t ed25519 -C "personal@email.com" -f ~/.ssh/id_ed25519_personal
 
# Agentga qo'shish
$ eval "$(ssh-agent -s)"
$ ssh-add ~/.ssh/id_ed25519_work
$ ssh-add ~/.ssh/id_ed25519_personal
 
# ~/.ssh/config
Host github.com-work
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_work
 
Host github.com-personal
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_personal
 
# Remote URL'larda host alias ishlatish
$ git remote set-url origin git@github.com-work:company/repo.git
# yoki shaxsiy
$ git remote set-url origin git@github.com-personal:username/repo.git

  • Har repo uchun mos aliasdan foydalaning (github.com-work vs github.com-personal).
  • Global user.name va user.email sozlamalarini repo darajasida override qiling.
$ git config user.name "Work Dev"
$ git config user.email "work-email@company.com"

Husky bilan ishlash (pre-commit hook)

Commitdan oldin kodni avtomatik tekshirish uchun husky va lint-staged ishlatamiz. Quyidagi misol pnpm bilan:

# o'rnatish
$ pnpm add -D husky lint-staged
 
# package.json ga prepare skript qo'shing (bir marta)
$ npm pkg set scripts.prepare="husky"
$ pnpm prepare
 
# pre-commit hook yaratish
$ npx husky add .husky/pre-commit "pnpm lint && pnpm typecheck && pnpm test -w --if-present && pnpm lint-staged"
 
# lint-staged konfiguratsiyasi (package.json ichida)
"lint-staged": {
  "*.{ts,tsx,js,jsx}": [
    "pnpm eslint --fix",
    "pnpm prettier --write"
  ],
  "*.{md,mdx,css,scss,json}": [
    "pnpm prettier --write"
  ]
}
  • Pre-commit paytida lint, typecheck, test va format avtomatik ishlaydi.
  • Agar vaqtinchalik o‘tib ketish kerak bo‘lsa: git commit -m "msg" --no-verify.
  • Monorepo bo‘lsa, -w yoki ishchi paketga mos buyruqlarni sozlang.

Branch nomlash konventsiyasi

Branch nomlari aniq va izchil bo‘lsin. Tavsiya etiladigan prefikslar:

feature/<short-scope>         # yangi imkoniyat
fix/<short-scope>             # xatoni tuzatish
chore/<short-scope>           # servis ishlar (deps, build, config)
refactor/<short-scope>        # qayta tuzish, API o‘zgarmaydi
docs/<short-scope>            # hujjatlar
perf/<short-scope>            # ishlashni optimallashtirish
  • Misol: feature/auth-login, fix/navbar-jump.
  • Kerak bo‘lsa issue ID qo‘shing: feature/123-auth-login.
  • Regex: ^(feature|fix|chore|refactor|docs|perf)/[a-z0-9-]+$.

Commit ID bilan qaytish

Turli holatlar uchun xavfsiz usullar:

# 1) Detach holatda eski commitni ko‘rish
$ git checkout <commit_sha>
# kerak bo‘lsa yangi branch oching
$ git switch -c hotfix/recover-<short>
 
# 2) Jamoaviy (public) tarixda orqaga qaytarish — revert (eng xavfsiz)
$ git revert <commit_sha>                # bitta commitni bekor qiladi
$ git revert <from_sha>^..<to_sha>       # intervalni bekor qiladi
 
# 3) Lokal tarixni tozalash — reset (tarixni o‘zgartiradi)
$ git reset --soft <commit_sha>          # o‘zgarishlar staged holatda qoladi
$ git reset --mixed <commit_sha>         # (default) staged dan chiqaradi
$ git reset --hard <commit_sha>          # DIQQAT: o‘zgarishlar yo‘qoladi
 
# 4) Fayl bo‘yicha tiklash
$ git restore path/to/file               # ishchi faylni tiklash
$ git restore --staged path/to/file      # staged dan chiqarish
  • Tarixni bo‘lishgan branchlarda revert afzal; resetni faqat lokal/foydalanuvchi branchlarda.
  • Rebase yoki resetdan so‘ng push: git push --force-with-lease.

VSCode uchun foydali Git extensionlar

Quyidagilar ish unumdorligini oshiradi. O‘rnatish (CLI):

$ code --install-extension eamodio.gitlens
$ code --install-extension mhutchie.git-graph
$ code --install-extension donjayamanne.githistory
$ code --install-extension github.vscode-pull-request-github
  • GitLens: blame, commit tarixi, advanced diff va navigatsiya.
  • Git Graph: vizual branch/commit grafigi.
  • Git History: fayl va repo tarixi.
  • GitHub PRs & Issues: PR/Issue bilan bevosita ishlash.

Shu bilan, git bilan amaliy ishlash uchun kerakli asosiy buyruqlar va tartiblar ko'rib chiqildi. Endi ularni projektlaringizda izchil qo'llash tajribangizni tez oshiradi.

2025 · nnolan