IlmHamroh
Dasturlash kitobi (eski nashr)/4-QISM — Git3/5-dars12 daqiqa
Mundarija (29)

GitHub bilan ishlash — remote, push, pull, Pull Request va fork (4.3-bob)

4-QISM — Git va hamkorlik · 3-mavzu


1. Kirish va motivatsiya

Lokal Git'ni (4.1, 4.2) bildik — lekin u faqat sizning kompyuteringizda edi. Real ishda kod bulutda saqlanadi, jamoa u bilan ishlaydi, siz uni boshqa joydan ham olasiz. GitHub — aynan shu: Git loyihalarini saqlash, ulashish va hamkorlik qiladigan dunyodagi eng katta platforma.

GitHub — shunchaki "backup" emas. U — dasturchining portfeli (ish beruvchilar ko'radi), ochiq kod dunyosi (millionlab loyiha), va jamoaviy ishning yuragi: Pull Request orqali kod ko'rib chiqiladi, muhokama qilinadi, sifatli holatda birlashtiriladi.

O'xshatish: lokal Git — uyingizdagi shaxsiy daftar. GitHub — umumiy kutubxona (bulut): daftaringizni u yerga qo'yasiz (push), boshqalar o'qiydi, nusxa oladi, hissa qo'shadi. Pull Request — "men shu o'zgarishni taklif qilaman; ko'rib chiqing, ma'qul bo'lsa qo'shing" degan rasmiy taklif.

Nega muhim?

  • Hamkorlik — jamoa bir loyihada (PR, code review — 15.2).
  • Portfolio — GitHub profilingiz ish beruvchilarga ko'rinadi 15.8-bob.
  • Ochiq kod — millionlab loyiha; hissa qo'shish 15.8-bob.
  • CI/CD 10.5-bob, deploy (10), GitHub Actions — GitHub ustida.

GitHub — koddan ko'p: kod saqlashdan tashqari, Issues (vazifa/xato kuzatuvi — "bu yerda bug bor", "shu funksiya kerak" deb yoziladi, muhokama qilinadi), Actions (avtomatlashtirish/CI — push'da test, deploy — 10.5), Projects (kanban taxta) ham bor. Loyiha shu yerda boshqariladi, nafaqat saqlanadi.


2. Nazariya — chuqur tushuntirish

2.1. Remote nima?

Remote — loyihaning uzoq (bulut) nusxasi (GitHub'dagi). Lokal repo 4.1-bob bilan remote o'rtasida kod push (yuklash) va pull (olish) qilinadi:

text
  Lokal (sizning kompyuter) ←──push/pull──→  Remote (GitHub)
       .git                                    origin

origin — remote'ning standart nomi (odatda asosiy GitHub repo).

2.2. SSH vs HTTPS (ulanish)

GitHub'ga ulanishning ikki usuli 0.4-bob:

  • HTTPS — https://github.com/user/repo.git; har push'da parol/token so'raydi (yoki credential manager).
  • SSH — git@github.com:user/repo.git; bir marta SSH kalit (0.2: 600 ruxsat — 10.1) sozlanadi, keyin parolsiz.

SSH afzal (bir marta sozlasangiz, qulay). SSH kalit yaratish: ssh-keygen 10.1-bob; ochiq kalitni GitHub sozlamalariga qo'shasiz.

2.3. Repo yaratish va ulash

Usul 1 — GitHub'da yaratib, lokalga olish (clone):

bash
git clone https://github.com/user/repo.git   # to'liq nusxa + tarix (0.4)
cd repo

Usul 2 — Lokalni GitHub'ga ulash:

bash
# GitHub'da bo'sh repo yaratasiz, keyin:
git remote add origin https://github.com/user/repo.git   # remote ulash
git branch -M main                                        # branch nomi
git push -u origin main                                   # birinchi push

2.4. Push — kodni yuklash

bash
git push                      # joriy branch'ni remote'ga yuklaydi
git push origin main          # aniq: origin remote'ga main branch
git push -u origin feature-x  # yangi branch'ni birinchi marta (-u: bog'laydi)

-u (upstream) — lokal va remote branch'ni bog'laydi; keyin shunchaki git push/git pull yetadi.

2.5. Pull va Fetch — kodni olish

bash
git fetch                     # remote o'zgarishlarini OLADI (lekin merge QILMAYDI)
git pull                      # fetch + merge (oladi va birlashtiradi)
git pull origin main          # aniq

fetch vs pull: fetch — o'zgarishlarni ko'rib chiqish uchun oladi (xavfsiz, merge yo'q). pull = fetch + merge (darrov birlashtiradi). Ehtiyot bo'lsangiz — avval fetch, ko'ring, keyin merge.

2.6. Pull Request (PR) — jamoaviy ishning yuragi

Pull Request — "men shu branch'dagi o'zgarishni asosiy kodga qo'shishni taklif qilaman" degan rasmiy so'rov. Bu — kodni ko'rib chiqish (code review — 15.2) va muhokama qilish nuqtasi:

text
  1. feature branch'da ishlash 4.2-bob → push qilish
  2. GitHub'da "Pull Request" ochish (feature → main)
  3. Jamoa kodni KO'RIB CHIQADI (review), izoh yozadi
  4. CI/CD avtomatik test ishlaydi 10.5-bob
  5. Ma'qullansa → MERGE (main'ga qo'shiladi)
  6. branch o'chiriladi

PR — nega muhim: kod boshqa ko'z bilan ko'riladi (xato/yaxshilash topiladi); avtomatik testlar 10.5-bob ishlaydi; tarix muhokama bilan hujjatlanadi. Hech qachon mainga to'g'ridan-to'g'ri push qilinmaydi — doim PR orqali (jamoa qoidasi).

Protected branch (himoyalangan branch): GitHub'da mainni sozlamalardan himoyaga olish mumkin — to'g'ridan-to'g'ri push bloklanadi, o'zgarish faqat PR orqali, review va CI o'tgachgina merge bo'ladi. Bu — yuqoridagi qoidani "iltimos" emas, majburiy qiladi (jamoa loyihalarida standart).

2.7. PR ish sikli (amaliy)

bash
# 1. main'ni yangilash
git switch main && git pull

# 2. feature branch
git switch -c feature-login
# (kod yozish, commit qilish — 4.1, 4.2)

# 3. push qilish
git push -u origin feature-login

# 4. GitHub'da PR ochish (web interfeys): feature-login → main
#    - tavsif yozish, reviewer tayinlash
# 5. Review + CI o'tgach → "Merge" tugmasi
# 6. Lokalda tozalash
git switch main && git pull && git branch -d feature-login

2.8. Fork — boshqaning loyihasiga hissa

Fork — boshqaning repo'sining o'z hisobingizga nusxasi (ochiq kodga hissa uchun — 15.8):

text
  1. GitHub'da loyihani FORK qilish (o'z hisobingizga nusxa)
  2. Fork'ni clone qilish (lokalga)
  3. branch'da o'zgarish 4.2-bob → o'z fork'ingizga push qilish
  4. ASL loyihaga Pull Request ochish (fork → asl repo)
  5. Loyiha egasi ko'rib, ma'qullasa — qo'shadi

Fork vs Branch: branch — o'zingizning repo ichida. Fork — boshqaning repo'sini o'zingizga nusxalash (yozish huquqingiz yo'q loyihaga hissa qo'shish uchun). Ochiq kod (open source) hissasining standart yo'li.

origin vs upstream (fork'ni yangilash): fork qilganda ikki remote bo'ladi — origin (sizning fork'ingiz) va upstream (asl loyiha). Asl loyiha oldinga ketadi; fork'ingiz orqada qoladi. Yangilab turish uchun asl repo'ni upstream qilib qo'shasiz va undan pull qilasiz:

bash
git remote add upstream https://github.com/asl-egasi/repo.git   # asl repo
git fetch upstream && git merge upstream/main                   # yangilash

2.9. Remote bilan ishlash buyruqlari

bash
git remote -v                 # remote'lar ro'yxati
git remote add origin <url>   # remote qo'shish
git remote remove origin      # o'chirish
git clone <url>               # to'liq nusxa olish

2.10. GitHub CLI (gh) — terminaldan chiqmasdan ishlash

Professional dasturchilar brauzer va terminal o'rtasida tinimsiz sakrashdan qochishadi. Rasmiy GitHub CLI (gh) vositasi GitHub'ning deyarli barcha funksiyalarini to'g'ridan-to'g'ri terminalda bajarish imkonini beradi:

bash
# 1. GitHub hisobiga ulanish (bir marta qilinadi)
gh auth login

# 2. PR ochish (brauzerga kirmasdan!)
gh pr create --title "feat(auth): Google OAuth qo'shildi" --body "Tizimga Google orqali kirish integratsiya qilindi."

# 3. Hamkasbingiz ochgan PR'ni lokalda tekshirish (avtomatik branch ochib beradi):
gh pr checkout 42

# 4. Review qilish va ma'qullash
gh pr review --approve -b "LGTM! Zo'r yozilibdi."

# 5. Birlashtirish va branch'ni o'chirish (Squash & Delete)
gh pr merge 42 --squash --delete-branch

# 6. Issue ro'yxatini ko'rish va yangi vazifa ochish
gh issue list
gh issue create --title "Redis ulanish xatosi" --body "Cluster rejimida ulanish uzilmoqda."

Foydasi: Brauzerni ochib, sichqoncha bilan tugmalar bosish o'rniga, terminalda bitta buyruq bilan PR ochish va review qilish jamoada ishlash tezligini 3-4 barobarga oshiradi.


3. Sintaksis — tez ma'lumotnoma

bash
# Ulash
git clone <url>               # nusxa olish
git remote add origin <url>   # remote ulash
git push -u origin main       # birinchi push

# Kundalik
git push                      # yuklash
git pull                      # olish + merge
git fetch                     # olish (merge'siz)

# PR sikli: branch → push -u → GitHub PR → review → merge → branch -d
# Fork: fork → clone → branch → push → PR (asl repo'ga)

4. Batafsil amaliy namunalar

Misol 1 — Lokal loyihani GitHub'ga (2.3)

bash
# Lokal loyiha tayyor (4.1: git init, commit'lar bor)
# GitHub'da bo'sh "todo-app" repo yaratdik, keyin:
git remote add origin https://github.com/ali/todo-app.git   # ulash
git branch -M main
git push -u origin main       # birinchi push (butun tarix yuklanadi)
# Endi GitHub'da kod ko'rinadi

Misol 2 — Kundalik push/pull (2.4, 2.5)

bash
# Ish boshida — eng so'nggi o'zgarishlarni olish
git pull                      # (jamoadagilar o'zgartirgan bo'lishi mumkin)

# (kod yozish, commit qilish — 4.1)
git add . && git commit -m "Profil sahifasi qo'shildi"

# Ishni yuklash
git push                      # remote'ga

Misol 3 — Pull Request sikli (2.7)

bash
git switch main && git pull                    # yangilash
git switch -c feature-search                   # branch (4.2)

echo "qidiruv kodi" > search.js
git add . && git commit -m "Qidiruv funksiyasi qo'shildi"
git push -u origin feature-search              # push qilish

# GitHub'da: feature-search → main PR ochiladi
# Tavsif: "Qidiruv funksiyasi: nom bo'yicha real-time qidiruv"
# Review + CI o'tgach → Merge

git switch main && git pull                    # merge'ni lokalga olish
git branch -d feature-search                   # branch tugadi

Misol 4 — Ochiq kodga hissa (fork — 2.8)

bash
# 1. GitHub'da "awesome-project" ni FORK qildik → github.com/ali/awesome-project
git clone https://github.com/ali/awesome-project.git   # o'z fork'ni clone qilish
cd awesome-project

git switch -c fix-typo                          # branch
# (xatoni tuzatish)
git add . && git commit -m "docs: README imlo xatosi tuzatildi"
git push -u origin fix-typo                     # o'z fork'ingizga

# 2. GitHub'da ASL loyihaga PR ochish (fork:fix-typo → asl:main)
# 3. Loyiha egasi ko'rib, ma'qullasa — qo'shadi (siz hissa qo'shdingiz!)

5. To'g'ri va noto'g'ri holatlar

1) mainga to'g'ridan-to'g'ri push (jamoada)

bash
# ❌ review'siz to'g'ridan main'ga (jamoa qoidasini buzadi — 2.6)
git switch main && git push

# ✅ feature branch → PR → review → merge (2.7)

2) Push'dan oldin pull qilmaslik

bash
# ❌ eski kod ustiga push → rad etiladi yoki conflict
git push   # (remote sizdan oldinda)

# ✅ avval pull (yangilash), keyin push (2.5)
git pull && git push

3) Maxfiy ma'lumotni push qilish

bash
# ❌ .env, parol, API kalit GitHub'ga (4.5, 14)
git add . && git push   # (.env ham ketdi!)

# ✅ .gitignore bilan istisno 4.5-bob; tasodifan ketsa — kalitni BEKOR qiling

4) Push qilingan commit'ni amend/rebase qilish

bash
# ❌ jamoa ishlatayotgan tarixni o'zgartirish (4.1, 4.2)
git commit --amend && git push --force

# ✅ push qilingach tarixni o'zgartirmang; yangi commit qiling

6. Keng tarqalgan xatolar va yechimlari

Xato 1 — Updates were rejected (non-fast-forward)

Sababi: remote'da sizda yo'q commit'lar bor (kimdir push qilgan — 2.5). Yechimi: git pull (yangilang, conflict bo'lsa yeching — 4.2), keyin git push.

Xato 2 — Permission denied (publickey)

Sababi: SSH kalit sozlanmagan/noto'g'ri (2.2, 0.2). Yechimi: SSH kalit yarating (ssh-keygen), GitHub'ga qo'shing; yoki HTTPS ishlating.

Xato 3 — remote origin already exists

Sababi: remote allaqachon ulangan 2.9-bob. Yechimi: git remote -v (tekshiring); git remote set-url origin <url> (o'zgartirish).

Xato 4 — Maxfiy ma'lumot push qilindi

Sababi: .gitignore yo'q yoki kech 4.5-bob. Yechimi: kalitni darrov bekor qiling (yangisini yaratish — 14); tarixdan tozalash murakkab.

Xato 5 — fatal: refusing to merge unrelated histories

Sababi: ikki mustaqil tarix (masalan GitHub'da README bor, lokalda boshqa). Yechimi: git pull origin main --allow-unrelated-histories (ehtiyot bilan).


7. Integratsiya — bu mavzu stack'ning qayerida uchraydi

  • Git asoslari/branch (4.1, 4.2): lokal commit/branch'lar remote'ga.
  • Git workflow 4.4-bob: PR strategiyasi.
  • CI/CD 10.5-bob: PR/push'da GitHub Actions avtomatik test/deploy.
  • Code review 15.2-bob: PR — review nuqtasi.
  • Xavfsizlik (14, 4.5): secrets'ni push qilmaslik.
  • Deploy (10, 13.11): GitHub'dan Vercel/server.
  • Portfolio/open source 15.8-bob: GitHub profili, fork hissasi.

8. Eng yaxshi amaliyotlar (best practices)

  • mainga to'g'ridan-to'g'ri push qilmang — doim PR orqali (jamoa — 2.6).
  • Push'dan oldin pull qiling — yangilang, conflict'ni erta hal qiling 2.5-bob.
  • SSH sozlang — qulay, xavfsiz 2.2-bob.
  • Mazmunli PR tavsifi — nima, nega, qanday sinash 2.6-bob.
  • Maxfiy ma'lumotni hech qachon push qilmang — .gitignore (4.5, 14).
  • Push qilingan tarixni o'zgartirmang (amend/force — 4-holat).
  • Kichik, fokuslangan PR'lar — review oson; katta PR — qiyin.
  • Branch'ni merge'dan keyin o'chiring (GitHub avtomatik taklif qiladi).

9. Amaliy loyiha: "GitHub'da To'liq Hamkorlik Sikli"

GitHub, push/pull, PR va fork'ni amalda mustahkamlash.

Maqsad

Remote ulash, push/pull, Pull Request sikli va fork orqali hissa qo'shishni o'zlashtirish.

Talablar (requirements)

  1. GitHub hisob + SSH: SSH kalit yaratib, GitHub'ga ulang 2.2-bob; yoki HTTPS token.
  2. Loyihani yuklash: lokal loyihani 4.1-bob GitHub'ga push qilish (Misol 1); README, .gitignore bilan 4.5-bob.
  3. Push/pull sikli: o'zgartirish → commit → push; boshqa joydan (yoki GitHub web) o'zgartirib, pull bilan olish (Misol 2).
  4. Pull Request: feature branch → push → GitHub'da PR ochish → (o'zingiz review qilib) merge → branch'ni o'chirish (Misol 3).
  5. PR tavsifi: mazmunli (nima, nega, qanday sinash — 2.6).
  6. Fork hissasi: biror ochiq loyihani (yoki do'stingizning repo'sini) fork qilish → tuzatish → PR ochish (Misol 4, 15.8).
  7. Conflict simulyatsiyasi: GitHub'da faylni o'zgartiring, lokalda ham; pull → conflict → yechish 4.2-bob.
  8. README'ni chiroyli to'ldiring (loyiha tavsifi, ishga tushirish — 0.7).

Maslahatlar (hint)

  • SSH: ssh-keygen -t ed25519, ochiq kalitni GitHub Settings → SSH keys.
  • Birinchi push: git push -u origin main 2.3-bob.
  • PR: GitHub'da branch push qilingach "Compare & pull request" tugmasi.
  • Push rad etilsa: git pull (2.5, 6-xato).
  • .env/secrets'ni hech qachon push qilmang 4.5-bob.
  • Fork: asl repo'da "Fork" tugmasi, keyin o'z nusxangizni clone qilish.

"Tayyor" mezonlari (acceptance criteria)

  • SSH/HTTPS bilan GitHub'ga ulanish ishlaydi.
  • Loyiha GitHub'da, README + .gitignore bilan.
  • Push/pull sikli ishlaydi.
  • Kamida bitta to'liq PR (branch → PR → merge → o'chirish).
  • PR tavsifi mazmunli.
  • Fork orqali biror repo'ga PR ochilgan.
  • Conflict yaratilgan va yechilgan.
  • Maxfiy ma'lumot push qilinmagan.

Yechim kodi ataylab berilmagan — bu loyihani o'zingiz yozib ko'ring.


10. Xulosa va keyingi bobga ko'prik

Bu bobda Git'ni bulutga ulashni — GitHubni o'rgandik:

  • Remote — loyihaning bulut nusxasi (origin); SSH (qulay) yoki HTTPS bilan ulanadi.
  • clone (nusxa olish), push (yuklash), pull (olish + merge), fetch (olish, merge'siz).
  • Pull Request — o'zgarishni taklif qilish; code review + CI nuqtasi; mainga doim PR orqali.
  • Fork — boshqaning repo'sini o'zingizga nusxalab, ochiq kodga hissa (PR bilan).
  • Best: PR orqali ish, push'dan oldin pull, secrets'ni push qilmaslik, tarixni o'zgartirmaslik.

Keyingi bob — 4.4-bob: Git workflow'lar (Gitflow, trunk-based). Git buyruqlarini bildik; endi jamoa ularni qanday tartibda ishlatishini — workflow strategiyalarini — o'rganamiz. Gitflow (rejali relizlar) va trunk-based (uzluksiz yetkazib berish) — qaysi loyihada qaysi biri to'g'ri kelishi.


Foydalanilgan rasmiy/ishonchli manbalar

  • docs.github.com — GitHub flow, Pull Requests, fork
  • git-scm.com — remote, push/pull/fetch/clone
  • Atlassian — comparing workflows, syncing with remotes
Ulashish:Telegram'da

O'qiganingizni mustahkamlang

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
GitHub bilan ishlash — remote, push, pull, Pull Request va fork (4.3-bob) — IlmHamroh