WisarWisar
Dasturlash kitobi/4-QISM — Git11 daqiqa

4.3-bob: GitHub — remote, push, pull, Pull Request, fork

4-QISM — Git va hamkorlik · 3-mavzu


1. Kirish va motivatsiya

Lokal Git'ni (4.1, 4.2) bildik — lekin u faqat sizning kompyuteringda 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 portfoli (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:

  • HTTPShttps://github.com/user/repo.git; har push'da parol/token so'raydi (yoki credential manager).
  • SSHgit@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'r, 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 ishla 4.2-bob  push
  2. GitHub'da "Pull Request" och (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 yangila
git switch main && git pull

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

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

# 4. GitHub'da PR och (web interfeys): feature-login  main
#    - tavsif yoz, reviewer tayinla
# 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 qil (o'z hisobingga nusxa)
  2. Fork'ni clone qil (lokalga)
  3. branch'da o'zgarish 4.2-bob  o'z fork'ingga push
  4. ASL loyihaga Pull Request och (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

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 ol
git pull                      # (jamoadagilar o'zgartirgan bo'lishi mumkin)

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

# Ishni yukla
git push                      # remote'ga

Misol 3 — Pull Request sikli (2.7)

bash
git switch main && git pull                    # yangila
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

# 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 ol
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
cd awesome-project

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

# 2. GitHub'da ASL loyihaga PR och (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 (yangila), 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 qil

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'zgartirma; yangi commit qil

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 (yangila, conflict bo'lsa yech — 4.2), keyin git push.

Xato 2 — Permission denied (publickey)

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

Xato 3 — remote origin already exists

Sababi: remote allaqachon ulangan 2.9-bob. Yechimi: git remote -v (tekshir); 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 qil (yangisini yarat — 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 qilma — doim PR orqali (jamoa — 2.6).
  • Push'dan oldin pull — yangila, conflict'ni erta hal qil 2.5-bob.
  • SSH sozla — qulay, xavfsiz 2.2-bob.
  • Mazmunli PR tavsifi — nima, nega, qanday sinash 2.6-bob.
  • Maxfiy ma'lumotni hech qachon push qilma.gitignore (4.5, 14).
  • Push qilingan tarixni o'zgartirma (amend/force — 4-holat).
  • Kichik, fokuslangan PR'lar — review oson; katta PR — qiyin.
  • Branch'ni merge'dan keyin o'chir (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 ula 2.2-bob; yoki HTTPS token.
  2. Loyihani yukla: lokal loyihani 4.1-bob GitHub'ga push (Misol 1); README, .gitignore bilan 4.5-bob.
  3. Push/pull sikli: o'zgartir commit push; boshqa joydan (yoki GitHub web) o'zgartirib, pull bilan ol (Misol 2).
  4. Pull Request: feature branch push GitHub'da PR och (o'zingiz review qilib) merge branch o'chir (Misol 3).
  5. PR tavsifi: mazmunli (nima, nega, qanday sinash — 2.6).
  6. Fork hissasi: biror ochiq loyihani (yoki do'sting repo'sini) fork qil tuzatish PR (Misol 4, 15.8).
  7. Conflict simulyatsiyasi: GitHub'da faylni o'zgartir, lokalda ham; pull conflict yech 4.2-bob.
  8. README'ni chiroyli to'ldir (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 qilma 4.5-bob.
  • Fork: asl repo'da "Fork" tugmasi, keyin o'z nusxangni clone.

"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

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
4.3-bob: GitHub — remote, push, pull, Pull Request, fork — Wisar