Skip to content

Latest commit

 

History

History
574 lines (407 loc) · 12 KB

File metadata and controls

574 lines (407 loc) · 12 KB

🐙 GitHub va Git — To'liq Qo'llanma

Bu qo'llanmada GitHub nima ekanligi, Git bilan qanday ishlash, kelib chiqadigan muammolar va ularning yechimlari batafsil yozilgan.


📌 Mundarija


🌐 GitHub nima?

GitHub — bu Git repozitoriyalarini internet orqali saqlash, ulashish va jamoaviy boshqarish uchun mo'ljallangan platforma. Microsoft tomonidan xizmat ko'rsatiladi.

GitHub yordamida siz:

  • Kodingizni bulutda saqlaysiz
  • Jamoa bilan bir loyihada ishlaysiz
  • Kodni tarixini ko'rasiz va boshqarasiz
  • Pull Request orqali kod tekshirishni tashkillaysiz
  • GitHub Actions orqali avtomatik test va deploy qilasiz
  • Open-source loyihalarga hissa qo'shasiz

⚖️ Git vs GitHub — Farqi

Xususiyat Git GitHub
Nima u? Versiya nazorat tizimi Veb platforma
Ishlash joyi Mahalliy kompyuter Internet (bulut)
Interfeys Terminal (buyruq qatori) Veb sayt + API
Kimga kerak? Hamma dasturchi Jamoaviy loyihalar
Bepulmi? Ha, ochiq manba Ha (asosiy tarif)
O'xshashi GitLab, Bitbucket

Qisqacha: Git — asbob, GitHub — shu asbobni ishlatish uchun platforma.


⚙️ O'rnatish va Sozlash

Git o'rnatish

# Ubuntu / Debian
sudo apt install git

# macOS (Homebrew orqali)
brew install git

# Windows
# https://git-scm.com/download/win dan yuklab oling

Birinchi sozlamalar

git config --global user.name "Ism Familiya"
git config --global user.email "email@example.com"

# Default branch nomini main qilish
git config --global init.defaultBranch main

# Sozlamalarni ko'rish
git config --list

SSH Kalit — GitHub uchun

# Kalit yaratish
ssh-keygen -t ed25519 -C "email@example.com"

# Kalitni ko'rish
cat ~/.ssh/id_ed25519.pub

# GitHub'ga qo'shish:
# GitHub → Settings → SSH and GPG keys → New SSH key → paste

# Ulanishni tekshirish
ssh -T git@github.com
# Muvaffaqiyatli: "Hi username! You've successfully authenticated..."

🚀 Asosiy Comandalar

Yangi Loyiha Boshlash

# Variant 1: Mahalliy papkani repoga aylantirish
mkdir mening-loyiham
cd mening-loyiham
git init
git remote add origin git@github.com:username/mening-loyiham.git

# Variant 2: GitHub'dan klonlash
git clone git@github.com:username/loyiha.git
cd loyiha

Kundalik Ish Jarayoni

# 1. Eng yangi holatni oling
git pull origin main

# 2. Yangi branch oching
git checkout -b feature/vazifa-nomi

# 3. Kod yozing...

# 4. O'zgarishlarni ko'ring
git status
git diff

# 5. Stage qiling
git add .

# 6. Commit qiling
git commit -m "feat: yangi funksiya qo'shildi"

# 7. GitHub'ga yuboring
git push origin feature/vazifa-nomi

# 8. GitHub'da Pull Request oching (UI orqali)

Eng Ko'p Ishlatiladigan Comandalar

# Holat ko'rish
git status

# Tarix ko'rish
git log --oneline --graph --all

# Farqni ko'rish
git diff
git diff HEAD~1

# Remote ko'rish
git remote -v

# Barcha branchlar
git branch -a

🌿 Branch bilan Ishlash

# Branch yaratish
git checkout -b feature/login

# Branchlar ro'yxati
git branch

# Branchga o'tish
git switch feature/login

# Branchni o'chirish (mahalliy)
git branch -d feature/login

# Branchni GitHub'dan o'chirish
git push origin --delete feature/login

# Remote branchni mahalliyga olish
git fetch origin
git checkout -b feature/login origin/feature/login

Branch Strategiyasi (GitHub Flow)

main          ●─────────────────────────────●  (doim ishga tayyor)
               \                           /
feature/login   ●──●──●──●  (PR → merge)

🔄 Pull Request (PR)

Pull Request — bu GitHub'da kod ko'rib chiqish (code review) jarayoni.

PR ochish qadamlari:

  1. Branch yaratib, kod yozing
  2. GitHub'ga push qiling
  3. GitHub → Compare & pull request tugmasini bosing
  4. PR sarlavhasi va tavsifini yozing
  5. Reviewer tayinlang
  6. Review tugagach → Merge pull request

PR Yaxshi Amaliyotlari

✅ PR sarlavhasi aniq bo'lsin: "feat: foydalanuvchi ro'yxatdan o'tishi qo'shildi"
✅ Kichik PR'lar — 200-400 qator o'zgarish
✅ Screenshot qo'shing (UI o'zgarsa)
✅ Testlar yozilganiga ishonch hosil qiling
✅ Hech bo'lmaganda 1 kishi review qilsin

🚨 Tez-tez Uchraydigan Muammolar


❌ Muammo 1: Merge Conflict

CONFLICT (content): Merge conflict in fayl.py
Automatic merge failed; fix conflicts and then commit the result.

Sababi: Ikki kishi bir xil faylning bir xil qatorini o'zgartirgan.

Yechimi:

# 1. Conflict bo'lgan fayllarni ko'ring
git status

# 2. Faylni oching — conflict belgisini toping:
<<<<<<< HEAD
    sizning o'zgarishingiz
=======
    boshqa kishining o'zgarishi
>>>>>>> feature/boshqa-branch

# 3. To'g'ri kodni qoldiring, conflict belgilarini o'chiring

# 4. Stage va commit qiling
git add fayl.py
git commit -m "fix: merge conflict hal qilindi"

❌ Muammo 2: Push Rejected — "non-fast-forward"

! [rejected] main -> main (non-fast-forward)
error: failed to push some refs to 'github.com:...'

Sababi: GitHub'da yangi commitlar bor, sizda yo'q.

Yechimi:

# Avval pull qiling
git pull origin main --rebase

# Keyin push
git push origin main

❌ Muammo 3: "detached HEAD" holati

HEAD detached at a1b2c3d

Sababi: Branchga emas, to'g'ridan-to'g'ri commitga o'tilgan.

Yechimi:

# Branchga qaytish
git switch main

# Yoki yangi branch ochish (o'zgarishlarni saqlab)
git switch -c yangi-branch-nomi

❌ Muammo 4: Yanlish Commitga Fayl Tushib Qoldi

Yechimi:

# Faylni commit'dan olib tashlash (o'zgarishlar saqlanadi)
git reset HEAD~1
git restore --staged maxfiy_fayl.env

# .gitignore ga qo'shing
echo ".env" >> .gitignore

# Qayta commit
git add .
git commit -m "fix: maxfiy fayl olib tashlandi"

❌ Muammo 5: Noto'g'ri Branch'ga Commit Qildim

# Oxirgi commitni olib, to'g'ri branchga ko'chirish

# 1. Commit hash'ni oling
git log --oneline

# 2. To'g'ri branchga o'ting
git checkout to'g'ri-branch

# 3. Commitni ko'chiring
git cherry-pick <commit-hash>

# 4. Noto'g'ri branchdan o'chiring
git checkout noto'g'ri-branch
git reset --hard HEAD~1

❌ Muammo 6: GitHub'ga Push'dan Keyin Xatoni Ko'rdim

# Xatoni to'g'irlang
# ...kod o'zgartirildi...

git add .
git commit --amend --no-edit   # oxirgi commitga qo'shib yuboring

# Force push (faqat o'zingizning branchingizda!)
git push origin feature/branch --force-with-lease

⚠️ --force ni hech qachon main branchda ishlatmang!


❌ Muammo 7: .gitignore Ishlamayapti

# Sababi: fayl avval track qilingan

# Faylni cache'dan olib tashlang
git rm --cached fayl_nomi.env
git rm --cached -r papka/

# Commit qiling
git add .gitignore
git commit -m "fix: gitignore yangilandi"

❌ Muammo 8: "Permission denied (publickey)"

git@github.com: Permission denied (publickey).

Sababi: SSH kalit GitHub'ga qo'shilmagan yoki agent ishlamayapti.

Yechimi:

# SSH agent ishga tushirish
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

# Kalitni tekshirish
ssh -T git@github.com

# Agar HTTPS ishlatmoqchi bo'lsangiz
git remote set-url origin https://github.com/username/loyiha.git

❌ Muammo 9: Katta Fayl Push Bo'lmayapti

remote: error: File video.mp4 is 150.00 MB; this exceeds GitHub's file size limit of 100 MB

Yechimi:

# Faylni tarixdan o'chirish
git filter-branch --force --index-filter \
  "git rm --cached --ignore-unmatch video.mp4" \
  --prune-empty --tag-name-filter cat -- --all

# Yoki Git LFS ishlatish (katta fayllar uchun)
git lfs install
git lfs track "*.mp4"
git add .gitattributes
git add video.mp4
git commit -m "chore: LFS bilan katta fayl qo'shildi"
git push origin main

❌ Muammo 10: Barcha O'zgarishlarni Bekor Qilish

# Uncommitted o'zgarishlarni bekor qilish
git restore .

# Oxirgi N ta commitni bekor qilish (mahalliy)
git reset --hard HEAD~3

# GitHub'ga ham qo'llash (EHTIYOT BILAN!)
git push origin main --force-with-lease

🔀 Merge Conflict — Batafsil

VS Code orqali hal qilish

VS Code conflict bo'lgan faylda 4 ta tugma ko'rsatadi:

  • Accept Current Change — sizning o'zgarishingiz
  • Accept Incoming Change — boshqa kishining o'zgarishi
  • Accept Both Changes — ikkalasini saqla
  • Compare Changes — taqqoslash

Rebase orqali Conflict Oldini Olish

# Main'dan eng yangi o'zgarishlarni oling
git fetch origin main

# Branchingizni main ustiga "ko'chiring"
git rebase origin/main

# Conflict bo'lsa, hal qiling va davom eting
git add .
git rebase --continue

# Rebase'ni bekor qilish
git rebase --abort

⚡ GitHub Actions (CI/CD)

GitHub Actions — bu kod push qilinganda avtomatik test va deploy qilish tizimi.

Oddiy Misol — .github/workflows/test.yml

name: Test

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - name: Python o'rnatish
        uses: actions/setup-python@v4
        with:
          python-version: '3.11'

      - name: Kutubxonalar o'rnatish
        run: pip install -r requirements.txt

      - name: Testlarni ishga tushirish
        run: pytest

Qachon ishlatiladi:

  • Har bir PR'da testlar o'tkazish
  • main'ga merge bo'lganda deploy qilish
  • Kod sifatini avtomatik tekshirish

📋 Foydali Buyruqlar Jadvali

Buyruq Vazifasi
git clone <url> Reponi yuklab olish
git status O'zgarishlar holati
git add . Barcha o'zgarishlarni stage qilish
git commit -m "..." Commit yaratish
git push origin <branch> GitHub'ga yuborish
git pull origin main Yangilanishlarni olish
git checkout -b <nom> Yangi branch yaratish
git merge <branch> Branchni birlashtirish
git stash O'zgarishlarni vaqtinchalik yashirish
git log --oneline Qisqa tarix
git reset HEAD~1 Oxirgi commitni bekor qilish
git revert <hash> Xavfsiz commitni qaytarish
git cherry-pick <hash> Bitta commitni ko'chirish
git rebase main Branchni main ustiga ko'chirish
git fetch --all Barcha yangilanishlarni olish
git remote -v Remote URL ko'rish
git tag v1.0.0 Versiya belgisi qo'yish
git diff O'zgarishlarni solishtirish
git blame <fayl> Kim o'zgartirganini ko'rish
git bisect Xatoni qaysi commitda ekanini topish

🏆 Eng Yaxshi Amaliyotlar

✅  Har kuni ish boshida git pull qiling
✅  Har bir vazifa uchun alohida branch oching
✅  Commit xabarlari aniq va ma'noli bo'lsin
✅  main branchni to'g'ridan-to'g'ri o'zgartirmang
✅  PR'larni kichik hajmda saqlang
✅  .gitignore faylini loyiha boshidan sozlang
✅  Maxfiy ma'lumotlarni (parol, token) hech qachon commit qilmang
✅  --force o'rniga --force-with-lease ishlating
✅  README.md har doim yangilangan bo'lsin

📖 Commit Xabarlari Qoidasi

feat:     yangi funksiya
fix:      xatoni tuzatish
docs:     faqat hujjat o'zgarishi
style:    formatlash (kod logikasi o'zgarmadi)
refactor: kod qayta tashkil etildi
test:     test qo'shildi yoki o'zgartirildi
chore:    yordamchi vazifalar (build, paketlar)
perf:     ishlash tezligini oshirish

Misol:

feat(auth): JWT token asosida login qo'shildi

- Access va refresh token mexanizmi
- Token muddati 15 daqiqa
- Foydalanuvchi ma'lumotlari PostgreSQL'da saqlanadi

Closes #42

📅 Tayyorlangan: GitHub & Git To'liq Qo'llanma
🔗 Rasmiy hujjatlar: https://docs.github.com