Git va GitHub

Jamoa bilan ishlash: fork va Pull Request

Ochiq kodli (open source) loyihalar va professional jamoalar bir necha dasturchi bir kod ustida ishlashini talab qiladi. Buning uchun GitHub maxsus ish oqimini taklif etadi: fork, branch, Pull Request va code review. Ushbu darsda ushbu jamoaviy oqimni bosqichma-bosqich o'rganamiz β€” bu bilan har qanday loyihaga hissa qo'sha olasiz.

Fork, Pull Request, issue va code review β€” bular asosan GitHub veb-saytida (brauzerda) bajariladigan amallar. Terminaldagi git buyruqlari ular bilan birga ishlatiladi. Kurs playground'ida bu amallar ishlamaydi β€” quyidagi bloklar statik misol va bosqichma-bosqich tavsif sifatida keltiriladi.

Fork nima?

Fork β€” bu boshqa birovning GitHub omborini o'z akkauntingizga to'liq nusxalash. Fork qilinganda, o'sha loyihaning aynan nusxasi sizning GitHub profilingizda paydo bo'ladi va u butunlay sizga tegishli bo'ladi β€” istagancha o'zgartirasiz, asl loyihaga ta'sir qilmaydi.

Fork nima uchun kerak? Chunki ochiq kodli loyihalarga har kim to'g'ridan-to'g'ri push qila olmaydi β€” faqat loyiha egalari. Fork esa quyidagi imkonni beradi:

Fork qilish oson: GitHub'da loyiha sahifasining o'ng yuqorisidagi Fork tugmasini bosasiz. Bir necha soniyada nusxa github.com/sizning-nomingiz/loyiha manzilida paydo bo'ladi.

upstream va origin: ikki remote

Fork bilan ishlaganda ikki masofaviy ombor bilan aloqada bo'lasiz. Bu tushunchalar dastlab chalkash tuyulishi mumkin, shuning uchun aniq ajratamiz:

Fork'ingizni klonlaganingizdan so'ng, asl loyihani upstream nomi bilan qo'shasiz:

# 1. O'z fork'ingizni klonlaymiz (origin avtomatik sozlanadi)
$ git clone https://github.com/sizning-nomingiz/loyiha.git
$ cd loyiha

# 2. Asl loyihani upstream sifatida qo'shamiz
$ git remote add upstream https://github.com/asl-muallif/loyiha.git

# 3. Tekshiramiz
$ git remote -v
origin    https://github.com/sizning-nomingiz/loyiha.git (fetch)
origin    https://github.com/sizning-nomingiz/loyiha.git (push)
upstream  https://github.com/asl-muallif/loyiha.git (fetch)
upstream  https://github.com/asl-muallif/loyiha.git (push)
Nomlarning ma'nosi: origin β€” "kelib chiqish joyi" (sizniki), upstream β€” "oqim boshlanadigan yuqori joy" (asosiy loyiha). Bu nomlar shartli kelishuv (konvensiya), lekin deyarli barcha loyihalarda shunday ishlatiladi.

Issue (muammo) yaratish

Issue β€” bu loyihada biror muammoni, xatoni yoki takliflni muhokama qilish uchun ochiladigan yozuv. Kod yozishdan oldin ko'pincha issue orqali muammoni bayon qilish yaxshi odat β€” bu jamoaga nima ustida ishlayotganingizni bildiradi.

Issue GitHub'ning Issues bo'limida yaratiladi. Yaxshi issue quyidagilarni o'z ichiga oladi:

Issue'lar shunchaki xatolar uchun emas. Ular yangi funksiya taklif qilish, savol berish yoki muhokama boshlash uchun ham ishlatiladi. Ko'p loyihalarda kod (PR) yozishdan oldin issue ochib, muallif bilan kelishib olish talab qilinadi.

Pull Request (PR) nima?

Pull Request (qisqacha PR) β€” bu "iltimos, mening o'zgarishlarimni loyihangizga qabul qiling" degan rasmiy so'rov. Siz o'z branch'ingizda kod yozasiz, uni fork'ingizga push qilasiz va GitHub'da asl loyihaga PR ochasiz.

PR β€” jamoaviy ishning markaziy vositasi. U shunchaki kodni birlashtirish emas, balki:

PR ochish oqimi: to'liq bosqichma-bosqich

Endi butun jarayonni boshidan oxirigacha ko'ramiz. Faraz qilaylik, siz ochiq kodli loyihaga xato tuzatishini qo'shmoqchisiz:

1-qadam. Loyihani GitHub'da Fork qiling (fork tugmasini bosing).

2-qadam. Fork'ingizni kompyuteringizga klonlang va upstream'ni qo'shing:

$ git clone https://github.com/sizning-nomingiz/loyiha.git
$ cd loyiha
$ git remote add upstream https://github.com/asl-muallif/loyiha.git

3-qadam. O'zgarish uchun yangi branch yarating. Hech qachon to'g'ridan-to'g'ri mainda ishlamang β€” har bir ish alohida branch'da:

$ git switch -c fix-login-button
Switched to a new branch 'fix-login-button'

4-qadam. Kodni o'zgartiring, so'ng commit qiling:

# ... kodni tuzatamiz ...
$ git add .
$ git commit -m 'Login tugmasi mobil ekrandagi xatosini tuzatdim'

5-qadam. Branch'ni o'z fork'ingizga (origin) push qiling:

$ git push -u origin fix-login-button
To https://github.com/sizning-nomingiz/loyiha.git
 * [new branch]      fix-login-button -> fix-login-button

6-qadam. GitHub'ga o'ting. Push'dan keyin GitHub odatda "Compare & pull request" tugmasini ko'rsatadi. Uni bosing, PR uchun aniq sarlavha va tavsif yozing, so'ng Create pull request tugmasini bosing.

7-qadam. PR ochildi. Endi loyiha egalari uni ko'rib chiqadi. Ular izoh qoldirishi, o'zgartirish so'rashi yoki darhol qabul qilishi mumkin.

PR ochilgandan keyin ham unga qo'shimcha commitlar qo'sha olasiz. Xuddi shu branch'ga yangi commit push qilsangiz, ular avtomatik ravishda ochiq PR'ga qo'shiladi. Bu review davomida tuzatishlarni kiritishni qulay qiladi.

Kod ko'rib chiqish (code review)

Code review (kod ko'rib chiqish) β€” bu PR'dagi kodni boshqa dasturchilar tomonidan tekshirilishi. Bu β€” sifatli dasturchilikning muhim qismi. Review paytida:

GitHub'da review uch xil xulosaga ega bo'ladi:

Yaxshi code review β€” bu tanqid emas, hamkorlik. Izohlarga xafa bo'lmang: ular kodni yaxshilash uchun. O'zingiz ham review qilganda muloyim va aniq bo'ling β€” muammoni ko'rsating va yaxshilash yo'lini taklif qiling.

Review muvaffaqiyatli tugagach, muallif Merge pull request tugmasini bosadi va sizning kodingiz asl loyihaga qo'shiladi. Tabriklaymiz β€” siz loyihaga hissa qo'shdingiz!

upstream bilan sinxronlash

Vaqt o'tishi bilan asl loyiha (upstream) rivojlanadi β€” boshqalar yangi kod qo'shadi. Sizning fork'ingiz esa eskiradi. Yangi ishga kirishishdan oldin fork'ingizni asl loyiha bilan sinxronlash muhim. Bu quyidagicha qilinadi:

# 1. main branch'ga o'tamiz
$ git switch main

# 2. Asl loyihadan (upstream) yangilanishlarni olamiz
$ git fetch upstream

# 3. upstream/main ni o'z main'imizga birlashtiramiz
$ git merge upstream/main

# 4. Yangilangan main'ni o'z fork'imizga (origin) yuboramiz
$ git push origin main

Endi fork'ingizning maini asl loyiha bilan bir xil holatda. Yangi funksiya uchun branch ochishdan oldin doim shu sinxronlashni bajaring β€” bu keyingi konfliktlarni kamaytiradi.

Yangi ish uchun branch'ni doim yangilangan main'dan oching. Eski main'dan ochilgan branch keyinchalik PR qilganda ko'p konfliktga sabab bo'ladi. To'g'ri tartib: upstream'dan sinxronlang → keyin git switch -c yangi-branch.
GitHub'da fork sahifasida "Sync fork" tugmasi ham bor β€” u brauzer orqali fork'ni upstream bilan sinxronlaydi. Bu terminaldan foydalanishga muqobil oson yo'l. Lekin terminal usulini bilish murakkabroq holatlarda foydali.

Xulosa

Jamoaviy ish oqimini o'rgandingiz β€” endi dunyodagi istalgan ochiq kodli loyihaga hissa qo'sha olasiz. Keyingi darsda Git'ning foydali vositalarini β€” .gitignore, undo va stash'ni o'rganamiz.