12-bo‘lim

Pull Request va kod tekshiruvi

Fork, Pull Request yaratish, kod tekshiruvi (code review) va jamoaviy ishlash odoblari.

🕑 12 daqiqa o‘qish 📄 867 so‘z 👁 7 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Ish oqimi
  2. PR yaratish
  3. Yaxshi PR tavsifi
  4. Kod tekshiruvi
  5. Tekshiruvchi sifatida
  6. Izoh yozish odobi
  7. Izoh turlari
  8. Izohlarga javob
  9. Merge usullari
  10. Fork bilan ishlash
  11. Draft PR
  12. PR shabloni
  13. CODEOWNERS
  14. Tarmoqni himoyalash
  15. Xulosa

Pull Request (PR) - jamoaviy ishlashning markazi. Bu "mening o'zgarishlarimni ko'rib chiqing va qabul qiling" degan rasmiy so'rov.

Ish oqimi #

1. Tarmoq switch -c feature/x 2. Ishlash commit, commit 3. Push push -u origin 4. PR ochish GitHub saytida 5. Tekshiruv hamkasblar izohi 6. Tuzatish yangi kommit + push 7. Tasdiq approve 8. Merge main ga qo'shildi qayta tekshiruvga Muhim jihat PR ochilgandan keyin ham push qilishingiz mumkin - u avtomatik yangilanadi
PR - kod sifatini nazorat qilishning asosiy vositasi

PR yaratish #

Terminal
git switch -c feature/hisobot
# ... ishlash va kommit qilish ...
git push -u origin feature/hisobot
Natija
remote: Create a pull request for 'feature/hisobot' on GitHub by visiting:
remote:      https://github.com/husanboy/loyiha/pull/new/feature/hisobot

Havolani oching yoki GitHub saytida Compare & pull request tugmasini bosing.

CLI orqali:

Terminal
gh pr create --title "Oylik hisobot sahifasi" --body "Fixes #42"

# Interaktiv rejimda
gh pr create

Yaxshi PR tavsifi #

MARKDOWN
## Nima qilindi

Admin panelga oylik savdo hisoboti sahifasi qo'shildi.

## Nima uchun

Mijoz har oy hisobotni qo'lda tayyorlashga majbur edi.
Bu vazifa 3 soat vaqt olardi.

## Qanday tekshirish

1. Admin panelga kiring
2. "Hisobotlar" bo'limiga o'ting
3. Oy va yilni tanlang
4. "Yuklab olish" tugmasini bosing

## Ekran surati

![Hisobot sahifasi](https://.../rasm.png)

## Eslatmalar

- `hisobotlar` jadvali uchun migratsiya qo'shildi
- PDF yaratish uchun yangi bog'liqlik qo'shilmadi, HTML dan foydalanildi

Fixes #42
PR ni kichik qiling
PR hajmiTekshiruv sifati
50 satrgachaHar bir satr diqqat bilan o'qiladi
200-400 satrAsosiy joylar ko'riladi
1000+ satr"LGTM" deb tasdiqlanadi, hech nima o'qilmaydi

Katta o'zgarishni bir necha PR ga bo'ling. Bu tekshiruvchiga hurmat.

Kod tekshiruvi #

Tekshiruvchi sifatida #

Nimaga e'tibor berish kerak?
  1. Kod nima qilyapti? - avval tushunib oling
  2. Xatolik holatlari - null, bo'sh massiv, katta son
  3. Xavfsizlik - SQL inyeksiya, XSS, huquq tekshiruvi
  4. Nomlar - o'zgaruvchi nomi mazmunni ochib beryaptimi?
  5. Takrorlanish - shu kod boshqa joyda ham bormi?
  6. Testlar - yangi mantiq testlar bilan qoplanganmi?

Nimaga e'tibor bermaslik kerak:

  • Otstup va bo'sh joylar - buni avtomatik formatlovchi hal qilsin
  • Shaxsiy uslub afzalliklari - "men boshqacha yozgan bo'lardim"

Izoh yozish odobi #

YomonYaxshi
"Bu kod juda yomon""Bu yerda array_map o'qishni osonlashtiradi deb o'ylayman"
"Nima uchun shunday qildingiz?!""Bu yondashuvni tanlash sababini tushuntira olasizmi?"
"Xato""Agar $mahsulotlar bo'sh bo'lsa, 14-satrda xatolik chiqadi"
"O'zgartiring""Buni alohida funksiyaga chiqarsak, testlash osonroq bo'ladi"
Kodni tanqid qiling, odamni emas

"Sizning kodingiz noto'g'ri" emas, "bu funksiya bo'sh massivda ishlamaydi".

Aniq, foydali va hurmatli izoh - jamoaning eng qimmatli odati.

Izoh turlari #

Natija
[blocker] Bu SQL inyeksiyaga ochiq - parametrlash kerak
[savol]   Bu yerda nima uchun tranzaksiya ishlatilmagan?
[taklif]  Bu shartni erta qaytish bilan soddalashtirsa bo'ladi
[nit]     Kichik: o'zgaruvchi nomi `x` emas, `mahsulotSoni` bo'lsa yaxshi
Muhimlik darajasini belgilang

[nit] (arzimas) belgisi muallifga "bu majburiy emas" degan signal beradi. [blocker] esa "buni tuzatmasdan merge qilmaymiz" degani.

Bu chalkashlikni yo'q qiladi va tekshiruvni tezlashtiradi.

Izohlarga javob #

Terminal
# Tuzatish kiritish
git add manba/hisobot.php
git commit -m "Tekshiruv izohlariga ko'ra tuzatildi: bo'sh massiv holati"
git push

PR avtomatik yangilanadi - yangi PR ochish shart emas.

Kommitlarni squash qilmang (PR ochiq turganda)

Agar --amend yoki rebase bilan tarixni o'zgartirsangiz, tekshiruvchi "nima o'zgardi?" ni ko'ra olmaydi.

Merge paytida squash qilish mumkin - lekin tekshiruv davomida emas.

Merge usullari #

Merge commit Squash and merge Rebase and merge Butun tarix saqlanadi Tarix shoxlanadi Barcha kommitlar bittaga Tarix toza va chiziqli Kommitlar saqlanadi Tarix chiziqli, xeshlar yangi Ko'p jamoalar "Squash and merge" ni tanlaydi - main tarixi o'qilishi oson bo'ladi
Uchala usul ham to'g'ri - jamoada bittasini tanlab, unga amal qiling

Fork bilan ishlash #

Boshqa odamning loyihasiga hissa qo'shish uchun.

1. Fork qiling - GitHub saytida Fork tugmasi. Bu loyihaning nusxasini sizning hisobingizga ko'chiradi.

2. Klonlang:

Terminal
git clone git@github.com:siz/loyiha.git
cd loyiha

3. Asl loyihani upstream sifatida qo'shing:

Terminal
git remote add upstream https://github.com/asl-muallif/loyiha.git
git remote -v
Natija
origin    [email protected]:siz/loyiha.git (fetch)
origin    [email protected]:siz/loyiha.git (push)
upstream  https://github.com/asl-muallif/loyiha.git (fetch)
upstream  https://github.com/asl-muallif/loyiha.git (push)

4. Ishlang:

Terminal
git switch -c fix/hujjat-xatosi
# ... o'zgartirish ...
git commit -am "Hujjatdagi imlo xatosi tuzatildi"
git push -u origin fix/hujjat-xatosi

5. PR oching - GitHub o'zi taklif qiladi: sizning tarmog'ingizdan asl loyihaning main iga.

6. Fork ni yangilab turing:

Terminal
git fetch upstream
git switch main
git merge upstream/main
git push origin main
Fork qachon kerak?
  • Sizga yozish huquqi berilmagan ochiq loyihalarda
  • Loyihaning o'z versiyangizni yaratmoqchi bo'lsangiz

Agar jamoa a'zosi bo'lsangiz va yozish huquqingiz bo'lsa - fork shart emas, to'g'ridan-to'g'ri tarmoq yaratasiz.

Draft PR #

Ish tugamagan bo'lsa ham PR ochish mumkin:

Terminal
gh pr create --draft --title "WIP: hisobot sahifasi"

Bu "hali tayyor emas, lekin ko'rib turing" degan signal. Draft PR ni merge qilib bo'lmaydi.

PR shabloni #

.github/pull_request_template.md fayli yarating:

MARKDOWN
## Nima qilindi


## Nima uchun


## Qanday tekshirish


## Tekshiruv ro'yxati

- [ ] Kod lokal ishga tushirilib sinaldi
- [ ] Testlar yozildi va o'tdi
- [ ] Hujjatlar yangilandi
- [ ] Migratsiya kerak bo'lsa qo'shildi

Har bir yangi PR shu shablon bilan ochiladi.

CODEOWNERS #

.github/CODEOWNERS fayli kim nimani tekshirishini belgilaydi:

Natija
# Standart
*                   @husanboy

# Frontend
/public/assets/     @jasur

# Baza
/database/          @malika @husanboy

# CI sozlamalari
/.github/           @husanboy

Tegishli fayl o'zgarganda GitHub avtomatik kerakli odamni tekshiruvga chaqiradi.

Tarmoqni himoyalash #

Settings → Branches → Add rule

QoidaNima beradi
Require pull requestTo'g'ridan-to'g'ri push taqiqlanadi
Require approvalsKamida N kishi tasdiqlashi kerak
Require status checksTestlar o'tishi shart
Require conversation resolutionBarcha izohlar hal qilinishi kerak
Do not allow bypassingAdminlar uchun ham majburiy
main ni himoyalang

Bu bitta sozlama "tasodifan main ga push qilib qo'ydim" muammosini butunlay yo'q qiladi.

Kichik jamoada ham foydali - o'zingizni o'zingizdan himoya qilasiz.

Amaliy topshiriq
  1. GitHub da biror ochiq loyihani fork qiling (masalan hujjatlar loyihasi).
  2. Uni klonlang va upstream remote qo'shing.
  3. Tarmoq yarating va kichik o'zgartirish kiriting.
  4. Push qiling va Pull Request oching.
  5. PR tavsifini to'liq yozing: nima, nima uchun, qanday tekshirish.
  6. O'z repozitoriyingizda .github/pull_request_template.md yarating.
  7. main tarmog'ini himoyalang: PR majburiy qilib qo'ying.
  8. Himoyalangan main ga to'g'ridan-to'g'ri push qilishga urinib ko'ring.
  9. Do'stingizdan PR ingizga izoh yozishni so'rang va unga javob bering.

Xulosa #

  • Pull Request - o'zgarishlarni tekshirish va birlashtirish so'rovi.
  • PR ni kichik qiling - 400 satrdan katta PR aslida tekshirilmaydi.
  • PR tavsifida nima, nima uchun va qanday tekshirish bo'lsin.
  • Kod tekshiruvida kodni tanqid qiling, odamni emas.
  • [blocker], [taklif], [nit] belgilari izoh muhimligini bildiradi.
  • Uch merge usuli bor; ko'p jamoalar Squash and merge ni tanlaydi.
  • Fork - yozish huquqi bo'lmagan loyihalarga hissa qo'shish uchun.
  • upstream remote orqali fork ni asl loyiha bilan yangilab turing.
  • Tarmoq himoyasi tasodifiy push va tekshiruvsiz merge dan saqlaydi.

Keyingi bo'limda rebase va tarixni tozalashni o'rganamiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.