Mundarija (35)
- Bu darsda
- 1. Nega bu kerak?
- 2. Fork, clone, branch — farqi
- 3. Fork yaratish
- 3.1 Brauzerda
- 3.2 Sinov haqida
- 4. Forkni klon qilish va upstream qo'shish
- 4.1 Klon
- 4.2 upstream yo'q bo'lsa
- 4.3 git remote add upstream
- 4.4 git fetch upstream
- 5. Forkni sinxron tutish
- 5.1 Asl repo oldinga ketdi
- 5.2 Sinxronlash: merge va push
- 5.3 Brauzerda va gh bilan
- 6. Hissa qo'shish: branch va PR
- 6.1 Branch va push
- 6.2 Forkdan PR
- 6.3 PR ochiq — asl repo yana o'zgardi
- 7. CONTRIBUTING.md — loyiha qoidalari
- 7.1 Fayl nima beradi
- 7.2 Hissa qo'shuvchi uchun odob
- 8. Ko'p uchraydigan xatolar
- 8.1 Remote nomida xato
- 8.2 Forkdagi main ga commit
- 8.3 PR'da begona commitlar
- 8.4 upstream ga push
- 9. Mashqlar
- 1-mashq (oson): Qaysi remote?
- 2-mashq (o'rta): Bo'sh joylarni to'ldiring
- 3-mashq (qiyin): Fork oqimi kompyuterda
- 4-mashq: Portfolio qadami — birinchi fork
- 10. Real ishda
- Xulosa
- Manbalar
Fork va upstream: boshqaning loyihasiga hissa qo'shish
Qisqacha: Boshqa odamning reposiga yozish huquqingiz yo'q. Shuning uchun uning forkini — GitHub'dagi o'z nusxangizni — yaratasiz. Forkni klon qilasiz (
origin) va asl repogaupstreamnomli ikkinchi remote qo'shasiz. Ish tartibi:git fetch upstream→mainniupstream/mainbilan sinxronlash → yangi branch →git push origin→ forkdan asl repoga PR. Loyiha qoidalari odatdaCONTRIBUTING.mdfaylida yozilgan bo'ladi.
Bu darsda
- Fork nima ekanini va u clone hamda branch'dan nimasi bilan farq qilishini bilib olasiz.
- Forkni klon qilib,
upstreamremote'ini qo'shasiz. - Asl repodagi yangiliklarni forkingizga uch yo'l bilan olib kelasiz.
- Forkdan asl repoga PR yuborish tartibini o'rganasiz.
- PR ochiq turganda asl repo o'zgarsa, branch'ni
rebasebilan yangilaysiz. CONTRIBUTING.mdfaylini o'qiysiz va yozasiz.
Oldin bilishingiz kerak: Pull Request: yaratish, muhokama va merge, Remote: clone, fetch, pull, push, Ajralgan tarix: pull --rebase va force-with-lease.
1. Nega bu kerak?
Oldingi ikki darsda Aziz «Bahor» reposiga bemalol push qilardi: repo uniki edi. Hamkasbi Malika ham repoga yozish huquqiga ega edi — u collaborator (GitHub asoslari darsidan).
Endi boshqa vaziyat. Jasur aka saytni choyxona jamoasining alohida reposiga ko'chirdi: bahor-jamoasi/bahor. U yerda yozish huquqi faqat jamoada. Aziz esa menyu sarlavhasida xato ko'rdi va tuzatmoqchi. Lekin repoga push qila olmaydi — GitHub rad etadi.
Ochiq kodli loyihalarda bu odatiy holat. Masalan, VS Code yoki Node.js reposiga dunyo bo'ylab minglab odam hissa qo'shadi. Ularning hech biriga yozish huquqi berilmagan. Ular fork orqali ishlaydi.
Fork (vilka, ayri) — boshqa odamning reposining GitHub'dagi sizning akkauntingizdagi nusxasi. Asl repo bilan bog'liq qoladi. GitHub hujjatida asl repo upstream repository deb ataladi. "Upstream" — "oqimning yuqorisi", ya'ni manba.
Hayotiy o'xshatish: kutubxonadagi kitob. Unga yozib bo'lmaydi. Siz kitobni nusxa ko'chirasiz va o'z nusxangizda tuzatish qilasiz. Keyin kutubxonachiga "shu sahifadagi xatoni tuzatdim, asl kitobga ham kiriting" deb ko'rsatasiz. Qabul qilish-qilmaslik — kutubxonachining ishi.
2. Fork, clone, branch — farqi
Uchala so'z ham "nusxa"ga o'xshaydi. Lekin har biri boshqa narsa:
| Nima | Qayerda | Kim boshqaradi |
|---|---|---|
| Branch | Bitta repo ichida | Repo egalari |
| Clone | Sizning kompyuteringizda | Siz |
| Fork | GitHub'da, sizning akkauntingizda | Siz |
GitHub hujjati farqni shunday aytadi: branch — bitta reponing qismi, fork esa o'z sozlamalari va hamkorlik maydoniga ega alohida repo. Forkning o'z issue'lari, PR'lari va Actions'i bor.
Fork oqimida bir vaqtda uchta repo qatnashadi:
flowchart LR
U["upstream<br/>bahor-jamoasi/bahor"] -- "Fork" --> F["origin<br/>login/bahor"]
F -- "git clone" --> L["Kompyuteringiz"]
U -- "git fetch upstream" --> L
L -- "git push origin" --> F
F -- "Pull Request" --> UNimaga qarang: siz asl repoga hech qachon to'g'ridan-to'g'ri push qilmaysiz. Undan faqat o'qiysiz (fetch). Yozish — faqat o'z forkingizga (push origin). Asl repoga o'zgarish faqat PR orqali, egasining roziligi bilan kiradi.
3. Fork yaratish
3.1 Brauzerda
GitHub hujjatidagi tartib:
- Asl repo sahifasini oching (
bahor-jamoasi/bahor). - O'ng yuqori burchakdagi Fork tugmasini bosing.
- Owner ro'yxatidan forkning egasini tanlang — o'z akkauntingiz.
- Xohlasangiz, Repository name va Description maydonlarini o'zgartiring.
- Copy the DEFAULT branch only belgisi — faqat asosiy branch nusxalanadi. Hissa uchun shu yetarli.
- Create fork ni bosing.
Bir necha soniyadan keyin login/bahor paydo bo'ladi. Fork sahifasida asl repo — upstream — doim ko'rsatib turiladi.
Bilish kerak bo'lgan ikki fakt (GitHub hujjatidan):
- Ochiq reponing forki ham ochiq bo'ladi. Uni yopiq qilib bo'lmaydi.
- Terminaldan ham fork qilish mumkin:
gh repo fork bahor-jamoasi/bahor.ghni GitHub CLI darsida o'rganamiz.
Maslahat: Fork odatda boshqaning reposidan qilinadi. O'z reposingizda ishlash uchun fork kerak emas — branch yetarli.
3.2 Sinov haqida
Bu darsdagi asl repo — bizning GitHub'dagi sinov reposi, chiqishlarda uni bahor-jamoasi/bahor deb ko'rsatdik. Forkni GitHub'da yarata olmadik: sinov reposi bizning o'z akkauntimizda edi, yangi repo yaratish esa sinov qoidalarida taqiqlangan. Shuning uchun fork o'rnida kompyuterdagi bare repo ishlatildi — Remote darsidagi kabi. Git uchun farqi yo'q: origin — qayerdadir turgan boshqa repo. Faqat manzillar boshqacha chiqadi, buni har safar aytamiz.
4. Forkni klon qilish va upstream qo'shish
4.1 Klon
Fork — oddiy repo. Uni Remote darsidagidek klon qilasiz — o'z forkingizni, asl reponi emas:
cd ~/kurs
git clone https://github.com/login/bahor.git
cd bahor
git remote -vCloning into 'bahor'...
done.
origin C:/Users/.../github/login-bahor.git (fetch)
origin C:/Users/.../github/login-bahor.git (push)Bizda origin — fork o'rnidagi papka. Sizda shu yerda https://github.com/login/bahor.git turadi. origin faqat forkni biladi. Asl repo haqida hali hech narsa yo'q.
4.2 upstream yo'q bo'lsa
Asl repodagi yangiliklarni olishga urinib ko'ramiz:
git merge upstream/mainmerge: upstream/main - not something we can mergeTarjimasi: "upstream/main — birlashtira oladigan narsa emas". Git bunday nomni bilmaydi. Remote-tracking branch'lar faqat fetch qilingan remote'lar uchun bor (Remote darsidan).
4.3 git remote add upstream
Asl repoga ikkinchi remote qo'shamiz. Nomi — upstream. Bu Git'ning maxsus so'zi emas, shunchaki hamma kelishgan nom. GitHub hujjati ham aynan shu nomni ishlatadi:
git remote add upstream https://github.com/bahor-jamoasi/bahor.git
git remote -vorigin C:/Users/.../github/login-bahor.git (fetch)
origin C:/Users/.../github/login-bahor.git (push)
upstream https://github.com/bahor-jamoasi/bahor.git (fetch)
upstream https://github.com/bahor-jamoasi/bahor.git (push)Haqiqiy forkda to'rttala qator ham GitHub manzili bo'ladi. GitHub hujjatidagi namuna shunday ko'rinishda:
origin https://github.com/YOUR-USERNAME/YOUR-FORK.git (fetch)
origin https://github.com/YOUR-USERNAME/YOUR-FORK.git (push)
upstream https://github.com/ORIGINAL-OWNER/ORIGINAL-REPOSITORY.git (fetch)
upstream https://github.com/ORIGINAL-OWNER/ORIGINAL-REPOSITORY.git (push)upstream uchun ham (push) qatori bor. Lekin unga push qilib bo'lmaydi — yozish huquqi yo'q. Git buni bilmaydi, GitHub esa rad etadi.
4.4 git fetch upstream
git fetch upstream
git branch -aFrom https://github.com/bahor-jamoasi/bahor
* [new branch] main -> upstream/main
* main
remotes/origin/HEAD -> origin/main
remotes/origin/main
remotes/upstream/HEAD -> upstream/main
remotes/upstream/mainEndi ikki to'plam remote-tracking branch bor: origin/... — forkingiz, upstream/... — asl repo. Hozir ikkalasi bir xil: fork endigina yaratildi.
Tekshirib ko'ring: Nega forkni klon qilasiz, asl reponi emas? Asl reponi klon qilib,
originga ishlasa bo'lmaydimi?
Javob
Asl repoga yozish huquqi yo'q — u origin bo'lsa, git push har safar rad etiladi. Ishni qayergadir yuborish kerak, aks holda PR ochib bo'lmaydi. Shuning uchun origin — siz yoza oladigan fork, upstream — faqat o'qiladigan asl repo. Asl reponi klon qilib qo'ygan bo'lsangiz, tuzatish oson: forkni yarating va remote nomlarini almashtiring.
5. Forkni sinxron tutish
5.1 Asl repo oldinga ketdi
Bir kun o'tdi. Jasur aka asl repoga ikki commit qo'shdi: ichimliklar bo'limi va ko'k choy narxi. Aziz o'z nusxasida holatni tekshirdi:
git status -sb## main...origin/main"Hamma narsa joyida" — ortda ham, oldinda ham yo'q. Bu yerda tuzoq bor. git status faqat o'z upstream branch'i bilan solishtiradi. main ning upstream branch'i esa origin/main, ya'ni fork. Fork ham asl repodan ortda qolgan, lekin git status buni ko'rmaydi.
fetch dan keyin ham:
git fetch upstream
git status -sbFrom https://github.com/bahor-jamoasi/bahor
e387de0..08ea578 main -> upstream/main
## main...origin/maingit fetch yangi commitlarni olib keldi (e387de0..08ea578), git status esa yana jim. Farqni o'zingiz so'rashingiz kerak — Remote darsidagi ikki nuqta bilan:
git log --oneline main..upstream/main08ea578 (upstream/main, upstream/HEAD) Menyu: ko'k choy narxini qo'sh
03744ca Menyu: ichimliklar bo'limini qo'sh"upstream/main da bor, main da yo'q" — Jasur akaning ikki commiti.
5.2 Sinxronlash: merge va push
GitHub hujjatidagi buyruqlar qatori — fetch, main ga o'tish, merge:
git switch main
git merge upstream/main
git push origin mainAlready on 'main'
Your branch is up to date with 'origin/main'.
Updating e387de0..08ea578
Fast-forward
menyu/index.html | 2 ++
1 file changed, 2 insertions(+)
To C:/Users/.../github/login-bahor.git
e387de0..08ea578 main -> mainFast-forward — chunki forkdagi main ga o'zimiz hech narsa qo'shmaganmiz (Merge darsidan). Bu muhim qoida: forkdagi main ga hech qachon commit qilmang. U faqat asl reponing ko'zgusi. Shunda sinxronlash har doim toza fast-forward bo'ladi.
Oxirgi qadam — git push origin main — ko'pincha unutiladi. GitHub hujjati ham alohida eslatadi: lokal sinxronlash faqat kompyuteringizdagi nusxani yangilaydi, GitHub'dagi fork uchun push qilish kerak.
git log --oneline --graph -4* 08ea578 (HEAD -> main, upstream/main, upstream/HEAD, origin/main, origin/HEAD) Menyu: ko'k choy narxini qo'sh
* 03744ca Menyu: ichimliklar bo'limini qo'sh
* e387de0 Bron: band qilish formasini qo'sh (#7)
* 33b7d8e Sozlama: CODEOWNERS faylini qo'sh (#6)Uchala ko'rsatkich — lokal main, origin/main, upstream/main — bitta commitda. Uchta repo sinxron.
switch va merge o'rniga git pull upstream main deb bir buyruqda ham yozish mumkin — keyinroq shunday qilamiz.
5.3 Brauzerda va gh bilan
Kompyuter yonida bo'lmasangiz, forkni GitHub'ning o'zida yangilash mumkin. GitHub hujjatiga ko'ra:
- Fork sahifasida fayllar ro'yxati ustida Sync fork ro'yxati bor. Yangi commitlarni ko'rib, Update branch ni bosasiz.
- Conflict bo'lsa, GitHub sizdan PR yaratishni so'raydi.
- Terminaldan:
gh repo sync login/bahor -b main.
Bu yo'llar GitHub'dagi forkni yangilaydi. Lokal nusxangiz uchun keyin baribir git pull kerak.
gh repo sync ni argumentsiz yozsangiz, u lokal repongizni uning remote'idan yangilaydi. Buni sinov reposining oddiy klonida sinadik: klon ikki commit ortda edi, gh repo sync dan keyin git log --oneline -1 eng oxirgi commitni ko'rsatdi. Terminalga esa hech narsa yozmadi.
Tekshirib ko'ring: Aziz
git fetch upstreamvagit merge upstream/mainqildi, lekin push qilmadi. Keyin PR ochdi. Fork GitHub'da qanday holatda?
Javob
GitHub'dagi fork eski holatda qoldi — merge faqat Aziz kompyuterida. PR'ga bu ta'sir qilmaydi, chunki PR alohida branch'dan ochiladi. Lekin fork sahifasida "ortda" yozuvi qoladi. Keyingi safar git push origin main bilan to'g'irlanadi.
6. Hissa qo'shish: branch va PR
6.1 Branch va push
Endi asosiy ish. Aziz menyu sarlavhasini aniqroq qilmoqchi. Qoida o'sha: alohida branch.
git switch -c fix/menyu-imlo
# menyu/index.html: <h1>Menyu</h1> -> <h1>Menyu va narxlar</h1>
git add menyu
git commit -m "Menyu: sarlavhani aniqlashtir"
git push -u origin fix/menyu-imloSwitched to a new branch 'fix/menyu-imlo'
[fix/menyu-imlo c22756b] Menyu: sarlavhani aniqlashtir
1 file changed, 1 insertion(+), 1 deletion(-)
To C:/Users/.../github/login-bahor.git
* [new branch] fix/menyu-imlo -> fix/menyu-imlo
branch 'fix/menyu-imlo' set up to track 'origin/fix/menyu-imlo'.Push — origin ga, ya'ni forkka. Haqiqiy GitHub forkida bu yerda ham remote: Create a pull request ... qatorlari chiqadi (Pull Request darsidagi kabi).
git branch -vv* fix/menyu-imlo c22756b [origin/fix/menyu-imlo] Menyu: sarlavhani aniqlashtir
main 08ea578 [origin/main] Menyu: ko'k choy narxini qo'shIkkala branch ham origin ga bog'langan. upstream dan esa faqat o'qiymiz.
6.2 Forkdan PR
PR forkdan asl repoga ochiladi. GitHub hujjatidagi tartib:
- Asl repo sahifasini oching (
bahor-jamoasi/bahor). - Fayllar ro'yxati ustidagi sariq bannerda Compare & pull request ni bosing.
- PR yaratish sahifasida compare across forks havolasini bosing — shunda boshqa repo'lar tanlanadi.
- Base branch ro'yxatida asl reponing
mainini tanlang. - "head fork" ro'yxatida forkingizni (
login/bahor), "compare" ro'yxatidafix/menyu-imloni tanlang. - Sarlavha va tavsif — Pull Request darsidagidek.
- Allow edits from maintainers belgisini qo'ying.
- Create pull request.
Allow edits from maintainers — "loyihani yurituvchilarga (maintainer — asl repoga yozish huquqi bor odamlar) mening branch'imni o'zgartirishga ruxsat". GitHub hujjatiga ko'ra, asl repoga push huquqi bor har kim PR branch'ingizni tahrirlay oladi. Jasur aka mayda xatoni o'zi tuzatib qo'yishi mumkin — sizni kutmasdan. Code review darsidagi Commit suggestion ham fork PR'ida shu ruxsat bilan ishlaydi.
6.3 PR ochiq — asl repo yana o'zgardi
PR ko'rib chiqilguncha Jasur aka asl repoga CONTRIBUTING.md faylini qo'shdi. Aziz yangilikni oldi:
git fetch upstream
git log --oneline --graph --all -6From https://github.com/bahor-jamoasi/bahor
08ea578..8ec0ff8 main -> upstream/main
* 8ec0ff8 (upstream/main, upstream/HEAD) Hujjat: CONTRIBUTING.md qo'sh
| * c22756b (HEAD -> fix/menyu-imlo, origin/fix/menyu-imlo) Menyu: sarlavhani aniqlashtir
|/
* 08ea578 (origin/main, origin/HEAD, main) Menyu: ko'k choy narxini qo'sh
* 03744ca Menyu: ichimliklar bo'limini qo'sh
* e387de0 Bron: band qilish formasini qo'sh (#7)
* 33b7d8e Sozlama: CODEOWNERS faylini qo'sh (#6)Tarix ajraldi. Conflict yo'q — Aziz menyuga, Jasur aka yangi faylga tegdi. Lekin ko'p loyihalar PR branch'i asl main ning eng oxirgi holatidan o'sishini so'raydi. Ochiq kodli loyihalarda odatda merge emas, rebase kutiladi — tarix toza bo'ladi:
git rebase upstream/main
git log --oneline --graph -4Successfully rebased and updated refs/heads/fix/menyu-imlo.
* 030276d (HEAD -> fix/menyu-imlo) Menyu: sarlavhani aniqlashtir
* 8ec0ff8 (upstream/main, upstream/HEAD) Hujjat: CONTRIBUTING.md qo'sh
* 08ea578 (origin/main, origin/HEAD, main) Menyu: ko'k choy narxini qo'sh
* 03744ca Menyu: ichimliklar bo'limini qo'shTo'g'ridan-to'g'ri upstream/main ustiga — lokal main ni yangilash shart emas. Commit SHA'si yangi: c22756b → 030276d. Endi uni forkka yuborish:
git pushTo C:/Users/.../github/login-bahor.git
! [rejected] fix/menyu-imlo -> fix/menyu-imlo (non-fast-forward)
error: failed to push some refs to 'C:/Users/.../github/login-bahor.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. If you want to integrate the remote changes,
hint: use 'git pull' before pushing again.
...Ajralgan tarix darsidagi holat. Bu branch'da faqat siz ishlaysiz, shuning uchun xavfsiz majburiy push:
git push --force-with-lease
git status -sbTo C:/Users/.../github/login-bahor.git
+ c22756b...030276d fix/menyu-imlo -> fix/menyu-imlo (forced update)
## fix/menyu-imlo...origin/fix/menyu-imloPR o'zi yangilanadi — u login/bahor dagi fix/menyu-imlo ga qaraydi.
gitGraph
commit id: "03744ca"
commit id: "08ea578"
branch fix/menyu-imlo
commit id: "c22756b eski"
checkout main
commit id: "8ec0ff8 CONTRIBUTING"
branch rebase-dan-keyin
commit id: "030276d yangi"Nimaga qarang: eski c22756b 08ea578 dan o'sgan edi. Rebase'dan keyin xuddi shu o'zgarish 030276d sifatida 8ec0ff8 ustida turibdi. "rebase-dan-keyin" — chizma uchun nom: aslida bu o'sha fix/menyu-imlo, faqat yangi joyda.
Diqqat: Agar "Allow edits from maintainers" yoniq bo'lsa va Jasur aka branch'ingizga commit qo'shgan bo'lsa,
--force-with-leasepush'ni rad etadi — uning commitini o'chirib yubormaslik uchun. Bunda avvalgit pull --rebase(Ajralgan tarix), keyin push.
Lokal main ni ham unutmang:
git switch main
git pull upstream main
git push origin mainSwitched to branch 'main'
Your branch is up to date with 'origin/main'.
From https://github.com/bahor-jamoasi/bahor
* branch main -> FETCH_HEAD
Updating 08ea578..8ec0ff8
Fast-forward
CONTRIBUTING.md | 10 ++++++++++
1 file changed, 10 insertions(+)
create mode 100644 CONTRIBUTING.md
To C:/Users/.../github/login-bahor.git
08ea578..8ec0ff8 main -> mainFETCH_HEAD — git pull upstream main vaqtincha olib kelgan commitning nomi. Ma'nosi: "upstream'dagi main olindi".
PR merge bo'lgach, tozalash Pull Request darsidagidek: main ni upstream dan sinxronlash, forkdagi va lokal branch'ni o'chirish.
7. CONTRIBUTING.md — loyiha qoidalari
7.1 Fayl nima beradi
Jasur aka qo'shgan fayl:
# «Bahor» loyihasiga hissa qo'shish
Rahmat! Bir necha qoida:
1. Katta o'zgarishdan oldin issue oching — avval kelishib olaylik.
2. Har ish — alohida branch: `feature/...` yoki `fix/...`.
3. Commit xabari: `Soha: buyruq maylidagi fe'l`
(masalan `Menyu: somsa narxini qo'sh`).
4. PR'dan oldin forkingizni `upstream/main` bilan sinxronlang.
5. PR tavsifida: nima, nega, qanday tekshirish.CONTRIBUTING.md — "hissa qo'shish" yo'riqnomasi. GitHub hujjatiga ko'ra:
- Fayl repo ildizida,
docs/yoki.github/papkasida tursa bo'ladi. Bir nechta bo'lsa, GitHub.github/→ ildiz →docs/tartibida birinchisini oladi. - Kimdir issue yoki PR ochsa, unga shu faylga havola ko'rsatiladi.
- Repo sahifasida ham alohida "Contributing" bo'limi paydo bo'ladi.
Sinov reposida GitHub faylni darhol tanidi. Uning "hamjamiyat profili" degan ro'yxatida manzil paydo bo'ldi:
https://github.com/bahor-jamoasi/bahor/blob/main/CONTRIBUTING.md7.2 Hissa qo'shuvchi uchun odob
Begona loyihaga birinchi PR'dan oldin:
CONTRIBUTING.mdni o'qing. Ko'p PR'lar faqat qoidaga zid bo'lgani uchun yopiladi: noto'g'ri branch nomi, testsiz kod.- Katta ish — avval issue. Bir hafta ishlab, "bizga bu kerak emas" degan javob olishdan ko'ra, oldin so'rash yaxshi.
- Kichik boshlang. Imlo xatosi, hujjatdagi noaniqlik,
good first issuebelgisi bor vazifa. Issue va label'larni keyingi darsda ko'ramiz. - Sabr qiling. Maintainer'lar — ko'pincha bo'sh vaqtida ishlaydigan ko'ngillilar. Bir hafta javob bo'lmasa, muloyim eslatma yozing.
8. Ko'p uchraydigan xatolar
8.1 Remote nomida xato
git pull upstrem mainfatal: 'upstrem' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.Tarjimasi: "upstrem git repozitoriysiga o'xshamaydi. Remote repozitoriydan o'qib bo'lmadi. Kirish huquqingiz to'g'ri va repo mavjudligiga ishonch hosil qiling". Git upstrem nomli remote topmadi va uni manzil deb tushundi. Xabar kirish huquqi haqida gapiradi, sabab esa oddiy imlo xatosi. Tuzatish: git remote -v bilan nomlarni tekshiring.
8.2 Forkdagi main ga commit
Aziz shoshib, tuzatishni to'g'ridan-to'g'ri main da qildi va forkka push qildi. Endi main asl repodan farq qiladi. Har sinxronlashda merge commit yoki conflict chiqadi. Tuzatish: commitni yangi branch'ga ko'chiring (git branch fix/nomi — branch hozirgi commitda yaratiladi), keyin main ni asl holatga qaytaring: git reset --hard upstream/main va git push --force-with-lease origin main. Reset xavfli buyruq — avval branch yaratilganini git log bilan tekshiring.
8.3 PR'da begona commitlar
Aziz eski fork main idan branch ochdi — sinxronlashni unutdi. PR'da uning bitta commiti o'rniga, asl repoda allaqachon boshqacha birlashtirilgan eski commitlar ham ko'rindi. Yoki conflict chiqdi. Tuzatish: git fetch upstream va git rebase upstream/main, keyin --force-with-lease.
8.4 upstream ga push
git push upstream ... — GitHub rad etadi, chunki yozish huquqi yo'q. Xatoni ko'rib, "huquq bering" deb so'ramang. Fork oqimining butun ma'nosi shu: siz forkka yozasiz, asl repoga PR yuborasiz.
9. Mashqlar
1-mashq (oson): Qaysi remote?
Har buyruqda origin yoki upstream dan qaysi biri bo'lishi kerak?
- Asl repodagi yangi commitlarni olish:
git fetch ___ - Tuzatish branch'ini yuborish:
git push -u ___ fix/narx - Forkni sinxronlagandan keyin GitHub'dagi forkni yangilash:
git push ___ main - PR branch'ini asl
mainustiga ko'chirish:git rebase ___/main
Yechim
upstream— yangiliklar asl repoda.origin— yozish faqat forkka.origin— GitHub'dagi fork.upstream— branch aslmainning oxirgi holatidan o'sishi kerak.
Qoida: upstream dan faqat olinadi, origin ga yuboriladi.
2-mashq (o'rta): Bo'sh joylarni to'ldiring
Fork klon qilindi. Asl repoga remote qo'shib, forkni sinxronlang:
git remote add upstream https://github.com/bahor-jamoasi/bahor.git
git upstream
git switch main
git merge
git push mainIshora: «Sinxronlash: merge va push» bo'limi.
Yechim
git remote add upstream https://github.com/bahor-jamoasi/bahor.git
git fetch upstream
git switch main
git merge upstream/main
git push origin mainremote add — yangi remote. fetch — yangiliklarni olish, branch'larga tegmasdan. merge upstream/main — lokal main ni asl repoga tenglashtirish. push origin main — GitHub'dagi forkni ham.
3-mashq (qiyin): Fork oqimi kompyuterda
GitHub'siz, uch papka bilan butun oqimni takrorlang. asl.git — asl repo, fork.git — fork, jasur — maintainer'ning nusxasi, aziz — sizning nusxangiz. Bare repo'ni Remote darsida ko'rgansiz.
cd ~/kurs/sinov-git
git init --bare asl.git
git clone asl.git jasur
cd jasur
echo "Bahor" > a.txt
git add a.txt
git commit -m "Bahor: boshlang'ich faylni qo'sh"
git push origin main
cd ..
git clone --bare asl.git fork.git
git clone fork.git aziz
cd aziz
git remote add upstream ../asl.gitgit clone --bare asl.git fork.git — GitHub'dagi Fork tugmasining lokal o'xshashi. Endi:
jasurdaa.txtga yangi qator qo'shib, commit qiling vagit push.azizda yangilikni oling va ko'ring.azizningmainini sinxronlang va forkka yuboring.git log --oneline -1 origin/mainnimani ko'rsatadi?git remote -vda nechta qator?
Yechim
cd ../jasur
echo "Menyu" >> a.txt
git commit -am "Menyu: yangi qator qo'sh"
git push
cd ../aziz
git fetch upstream
git log --oneline main..upstream/main
git merge upstream/main
git push origin main
git log --oneline -1 origin/main
git remote -vBiz sinab ko'rdik. Boshida bo'sh repo klon qilinganda warning: You appear to have cloned an empty repository. chiqadi — "bo'sh repozitoriyni klon qilganga o'xshaysiz". Bu normal: asl.git da hali commit yo'q. Oxirgi qismlar:
From ../asl
* [new branch] main -> upstream/main
8c9affe (upstream/main, upstream/HEAD) Menyu: yangi qator qo'sh
Updating d17a3ab..8c9affe
Fast-forward
a.txt | 1 +
1 file changed, 1 insertion(+)
To C:/Users/.../kurs/sinov-git/fork.git
d17a3ab..8c9affe main -> main
8c9affe (HEAD -> main, upstream/main, upstream/HEAD, origin/main, origin/HEAD) Menyu: yangi qator qo'sh
origin C:/Users/.../kurs/sinov-git/fork.git (fetch)
origin C:/Users/.../kurs/sinov-git/fork.git (push)
upstream ../asl.git (fetch)
upstream ../asl.git (push)origin/main endi Jasurning commitini ko'rsatadi — fork sinxron. git remote -v da to'rt qator: har remote uchun fetch va push. upstream ning manzili biz yozgandek nisbiy (../asl.git) qoldi. Mashqdan keyin sinov-git dagi bu papkalarni o'chirsangiz bo'ladi.
4-mashq: Portfolio qadami — birinchi fork
Bu darsning ko'nikmasi portfolio'ga emas, boshqa loyihaga kerak. Shuning uchun haqiqiy fork bilan mashq qilamiz.
- GitHub hujjati fork mashqi uchun maxsus ochiq repo beradi:
octocat/Spoon-Knife. Uni o'z akkauntingizga fork qiling. - Forkni
~/kurs/sinov-git/ga klon qiling vaupstreamqo'shing. git remote -vvagit fetch upstreambilan ikkala remote'ni tekshiring.- Kursdoshingiz bo'lsa — uning portfolio reposini fork qiling, matndagi bitta xatoni tuzating va PR yuboring. Kursdoshingiz esa sizning PR'ingizni Code review darsidagidek ko'rib chiqsin.
- O'z portfolio'ingiz README'siga qisqa "Hissa" bo'limini qo'shing: "Xato topsangiz — issue oching yoki fork qilib PR yuboring". PR orqali, albatta.
Yechim
cd ~/kurs/sinov-git
git clone https://github.com/login/Spoon-Knife.git
cd Spoon-Knife
git remote add upstream https://github.com/octocat/Spoon-Knife.git
git remote -v
git fetch upstreamlogin o'rniga o'z GitHub nomingizni yozing. git remote -v GitHub hujjatidagi namunadagidek to'rt qator chiqaradi: origin — sizning forkingiz, upstream — octocat/Spoon-Knife. Fork endigina yaratilgani uchun git log --oneline main..upstream/main bo'sh chiqadi.
Spoon-Knife ga PR yuborish shart emas — u faqat fork mashqi uchun. Haqiqiy PR — kursdoshingiz portfolio'siga: fork, klon, upstream, branch, commit, git push -u origin, compare across forks bilan PR.
README bo'limi uchun portfolio'da odatdagi tartib: branch, commit (README: hissa bo'limini qo'sh), PR, merge.
10. Real ishda
- Ochiq kod — fork orqali. GitHub'dagi deyarli hamma ochiq loyihaga hissa shu tartibda keladi. Birinchi PR'ingiz katta bo'lishi shart emas — hujjatdagi xato ham hisob.
- Kompaniyalarda kamroq. Jamoa odatda bitta repoda branch'lar bilan ishlaydi — hammada yozish huquqi bor. Fork ba'zan boshqa jamoaning reposiga hissa qo'shishda ishlatiladi.
- Fork — loyihani davom ettirish. Asl loyiha tashlab ketilsa, kimdir forkni yangi asosiy versiyaga aylantiradi. GitHub hujjatiga ko'ra, ochiq repo o'chirilsa, uning faol forklaridan biri tarmoqning yangi "asli"ga aylanadi.
- Portfolio uchun. Ishga oluvchi GitHub profilingizda boshqa loyihalarga qabul qilingan PR'larni ko'rsa, bu jamoada ishlay olishingizni ko'rsatadi. Bu haqda Open source darsida batafsil.
- Intervyuda so'raladi: "Fork va clone farqi?", "Forkni qanday yangilaysiz?", "
originvaupstreamnima?" Bu dars uchalasiga javob.
Xulosa
- Fork — boshqaning reposining GitHub'dagi sizning nusxangiz; asl repo — upstream.
- Uch repo:
upstream(faqat o'qiladi),origin= fork (yoziladi), lokal klon. git remote add upstream <url>→git fetch upstream→git log main..upstream/main.git statusfaqatoriginbilan solishtiradi — asl repodan ortda qolganingizni ko'rsatmaydi.- Sinxronlash:
git switch main,git merge upstream/main(yokigit pull upstream main),git push origin main. Brauzerda — Sync fork. - Forkdagi
mainga commit qilmang; har hissa — alohida branch, forkdan PR (compare across forks). - PR ochiq turganda:
git rebase upstream/mainvagit push --force-with-lease. CONTRIBUTING.md(.github/, ildiz yokidocs/) — loyiha qoidalari; GitHub unga issue va PR ochishda havola beradi.
Keyingi dars: Issues, Projects va shablonlar — vazifa va xatolarni GitHub'da rejalashni, label va shablonlarni o'rganamiz.
Manbalar
- GitHub Docs: "About forks", "Fork a repository", "Syncing a fork" — docs.github.com
- GitHub Docs: "Creating a pull request from a fork", "Allowing changes to a pull request branch created from a fork" — docs.github.com
- GitHub Docs: "Setting guidelines for repository contributors" — docs.github.com
- Git hujjati: "git-remote", "git-fetch", "git-rebase", "git-push" (
--force-with-lease) — git-scm.com/docs
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!