Fork — nima, qachon kerak, fork workflow

~15 daq · Git · GitHub bilan ishlash

Muammodan boshlaylik

Siz ishlatadigan ochiq kodli kutubxonada (masalan, mashhur React komponentlari to'plami) xato topdingiz va uni qanday tuzatishni bilasiz. Lekin:

git clone https://github.com/kutubxona/ui.git
# ... tuzatish ...
git push
remote: Permission to kutubxona/ui.git denied to otabek.
fatal: unable to access 'https://github.com/kutubxona/ui.git/': The requested URL returned error: 403

Albatta — begona loyihaga yozish huquqingiz yo'q. Aks holda har kim istalgan loyihani buzishi mumkin edi. Unda qanday hissa qo'shasiz?

Fork orqali.


Fork nima?

Fork — boshqa birovning repozitoriysining GitHub dagi sizning hisobingizdagi to'liq nusxasi. Unda siz to'liq egasiz: push qilishingiz, branch yaratishingiz mumkin.

   github.com/kutubxona/ui        (upstream — asl loyiha)
              │
              │  Fork tugmasi
              ▼
   github.com/otabek/ui           (origin — sizning nusxangiz)
              │
              │  git clone
              ▼
   Sizning kompyuteringiz

Keyin o'z fork ingizdan asl loyihaga Pull Request ochasiz. Loyiha egalari uni ko'rib chiqadi va qabul qiladi yoki rad etadi.


Fork workflow — qadam-baqadam

1. Fork qilish

Asl repozitoriy sahifasida — o'ng yuqorida Fork tugmasi → Create fork.

Yoki:

gh repo fork kutubxona/ui --clone

2. O'z fork ingizni clone qilish

git clone git@github.com:otabek/ui.git
cd ui

3. Asl loyihani upstream sifatida qo'shish

git remote add upstream https://github.com/kutubxona/ui.git
git remote -v
origin    git@github.com:otabek/ui.git (fetch)
origin    git@github.com:otabek/ui.git (push)
upstream  https://github.com/kutubxona/ui.git (fetch)
upstream  https://github.com/kutubxona/ui.git (push)
  • origin — sizning fork ingiz: bu yerga push qilasiz
  • upstream — asl loyiha: bu yerdan yangiliklarni olasiz

4. Branch da ishlash

git switch -c fix/button-focus-ring
# ... tuzatish, test, commit ...
git push -u origin fix/button-focus-ring

[!WARNING] Fork ning main ida ishlamang — har doim alohida branch. Aks holda fork ingizning main i asl loyihadan ajralib ketadi va keyingi PR lar chalkash bo'ladi.

5. Pull Request ochish

GitHub o'zi taklif qiladi: "Compare & pull request". PR sahifasida:

  • base repository: kutubxona/ui, base: main
  • head repository: otabek/ui, compare: fix/button-focus-ring

Fork ni yangilab turish

Siz ishlayotgan paytda asl loyihada yangi commitlar paydo bo'ladi. Fork avtomatik yangilanmaydi.

git switch main
git fetch upstream
git merge upstream/main          # yoki: git rebase upstream/main
git push origin main             # fork dagi main ni ham yangilash

Yoki GitHub da fork sahifasida — Sync fork → Update branch.

Feature branch ni yangilash (PR conflict bersa):

git switch fix/button-focus-ring
git fetch upstream
git rebase upstream/main
git push --force-with-lease      # o'z branch ingiz — xavfsiz (17-dars)

Ochiq loyihaga hissa qo'shish odobi

Ochiq loyiha egalari — ko'pincha bo'sh vaqtida ishlaydigan ko'ngillilar. Ularning vaqtini hurmat qiling:

  1. CONTRIBUTING.md ni o'qing — loyihaning qoidalari: kod uslubi, testlar, commit formati
  2. Avval issue oching (katta o'zgarishlar uchun) — "Men X ni qo'shmoqchiman, qabul qilasizmi?" 2 hafta ishlab, keyin "bu loyiha yo'nalishiga mos emas" eshitish — achinarli
  3. Mavjud issue larni qidiring — balki kimdir allaqachon ishlayapti
  4. Kichik boshlang — hujjatdagi xato, typo, kichik bug. good first issue yorlig'i — yangi hissa qo'shuvchilar uchun
  5. Testlar va lint — PR dan oldin lokalda ishga tushiring
  6. Sabr qiling — javob kunlar yoki haftalar olishi mumkin

[!TIP] Birinchi ochiq kodli hissa uchun: GitHub da label:"good first issue" bo'yicha qidiring, yoki goodfirstissue.dev va firstcontributions — mashq uchun maxsus repozitoriy.


Fork yana qachon ishlatiladi

  • Loyihani o'z yo'nalishingizda rivojlantirish — asl loyiha tashlab ketilgan yoki siz boshqacha yo'l tanlaysiz. Mashhur misollar: LibreOffice (OpenOffice fork i), MariaDB (MySQL fork i), OpenTofu (Terraform fork i)
  • Shablon sifatida — lekin buning uchun GitHub da Template repository yaxshiroq ("Use this template" — fork bog'lanishisiz toza nusxa)
  • Kompaniya ichida — ba'zi jamoalar hatto ichki loyihalarda ham fork workflow ishlatadi: hech kim asosiy repozitoriyga to'g'ridan-to'g'ri yozmaydi

Jamoa ichida, umumiy repozitoriyga yozish huquqi bo'lsa — fork shart emas: oddiy branch + PR (23-dars) yetarli.


Nima uchun shunday?

Nima uchun fork GitHub dagi nusxa — oddiy clone dan keyin PR ochib bo'lmaydimi?

Chunki PR — ikki GitHub repozitoriy orasidagi so'rov. Asl loyiha egasi sizning kompyuteringizdagi branch ni ko'ra olmaydi; u faqat GitHub dagi narsani ko'radi. Fork — sizning o'zgarishlaringiz uchun ommaviy joy: siz unga yozasiz (chunki u sizniki), egasi esa undan o'qiydi (chunki u ommaviy). Bu model millionlab notanish odamlarga bir-birining loyihalariga xavfsiz hissa qo'shish imkonini berdi — hech kimga yozish huquqi bermasdan. GitHub ning ochiq kod dunyosidagi muvaffaqiyati aynan shu oddiy "Fork → PR" mexanizmiga asoslangan.


Xulosa

Eslab qoling:

  • Fork — begona repozitoriyning GitHub dagi sizning nusxangiz
  • Workflow: Fork → clone → upstream qo'shish → branch → push (origin ga) → PR (upstream ga)
  • origin — sizning fork; upstream — asl loyiha
  • Fork ning main ida ishlamang — branch lar
  • Yangilash: git fetch upstream → merge/rebase upstream/main → push origin main; yoki "Sync fork"
  • Odob: CONTRIBUTING.md, avval issue, kichik PR, testlar, sabr
  • good first issue — birinchi hissa uchun
  • Jamoa ichida yozish huquqi bo'lsa — fork shart emas

Keyingi dars

25-dars: Issue — loyihada muammo bildirish, label, assignee, milestone