20-bo‘lim
Amaliy loyiha - jamoaviy ish oqimi
O'rganilgan barcha bilimlarni birlashtirib, boshidan oxirigacha to'liq loyiha tsiklini bajarish.
Ushbu bo‘lim mundarijasi
- Loyiha topshirig'i
- Bosqich 1 - loyihani boshlash
- Bosqich 2 - hujjatlar
- Bosqich 3 - GitHub ga ulash
- Bosqich 4 - birinchi imkoniyat
- Bosqich 5 - CI sozlash
- Bosqich 6 - konfliktni yaratish va hal qilish
- Bosqich 7 - tarixni tozalash
- Bosqich 8 - reliz
- Bosqich 9 - shoshilinch tuzatish
- Yakuniy tarix
- Buyruqlar xulosasi
- Tekshiruv ro'yxati
- Yakuniy xulosa
Yigirma bo'lim davomida o'rgangan hamma narsani bitta amaliy loyihada birlashtiramiz - repozitoriy yaratishdan reliz chiqarishgacha.
Loyiha topshirig'i #
Kichik "Vazifalar ro'yxati" ilovasi ustida jamoada ishlash tsiklini to'liq bajaring:
- Repozitoriy yaratish va sozlash
- To'g'ri hujjatlar va
.gitignore - Ish oqimini tanlash va yozib qo'yish
- Tarmoqda ishlash, PR, kod tekshiruvi
- Konfliktni hal qilish
- Tarixni tozalash
- CI sozlash
- Reliz chiqarish
- Shoshilinch tuzatish
Bosqich 1 - loyihani boshlash #
mkdir vazifalar && cd vazifalar
git init
git branch -M main
Asosiy sozlamalar:
git config user.name "Husanboy Qodirov"
git config user.email "[email protected]"
Boshlang'ich fayllar:
cat > .gitignore << 'EOF'
.env
vendor/
node_modules/
storage/logs/*.log
*.sqlite
.DS_Store
Thumbs.db
.idea/
.vscode/
EOF
cat > .editorconfig << 'EOF'
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 4
[*.{yml,yaml,json}]
indent_size = 2
EOF
git add .gitignore .editorconfig
git commit -m "chore: loyiha sozlamalari qo'shildi"
Bosqich 2 - hujjatlar #
README.md:
# Vazifalar ro'yxati
Kundalik vazifalarni boshqarish uchun oddiy veb-ilova.
## Imkoniyatlar
- Vazifa qo'shish, tahrirlash va o'chirish
- Bajarilgan deb belgilash
- Muddat va muhimlik darajasi
- Kategoriya bo'yicha filtrlash
## Talablar
| Dastur | Versiya |
|--------|---------|
| PHP | 8.1+ |
| MySQL | 5.7+ |
## O'rnatish
git clone [email protected]:husanboy/vazifalar.git
cd vazifalar
cp .env.example .env
php tools/migrate.php
php -S localhost:8000 -t public
## Litsenziya
MIT
CONTRIBUTING.md:
# Hissa qo'shish
## Ish oqimi
GitHub Flow: `main` har doim ishlaydigan holatda.
1. `main` dan tarmoq yarating
2. Prefiks: `feature/`, `fix/`, `docs/`, `chore/`
3. PR oching, kamida bitta tasdiq oling
4. "Squash and merge" bilan birlashtiring
## Kommit xabarlari
Format: `tur(soha): tavsif`
Turlar: `feat`, `fix`, `docs`, `style`, `refactor`, `test`, `chore`
## PR talablari
- [ ] Testlar o'tdi
- [ ] Sintaksis xatosi yo'q
- [ ] Hujjatlar yangilandi
git add README.md CONTRIBUTING.md LICENSE
git commit -m "docs: loyiha hujjatlari qo'shildi"
Bosqich 3 - GitHub ga ulash #
gh repo create vazifalar --public --source=. --push
# Yoki qo'lda
git remote add origin git@github.com:husanboy/vazifalar.git
git push -u origin main
Himoyani yoqing: Settings → Branches → Add rule
- Branch name pattern:
main - Require a pull request before merging
- Require status checks to pass
Bosqich 4 - birinchi imkoniyat #
git switch -c feature/vazifa-qoshish
mkdir -p manba public
cat > manba/Vazifa.php << 'EOF'
<?php
class Vazifa
{
public function __construct(
public readonly int $id,
public string $matn,
public bool $bajarildi = false,
public ?string $muddat = null,
) {}
public function bajarilganDebBelgila(): void
{
$this->bajarildi = true;
}
public function kechikkanmi(): bool
{
if ($this->muddat === null || $this->bajarildi) {
return false;
}
return strtotime($this->muddat) < time();
}
}
EOF
git add manba/Vazifa.php
git commit -m "feat(vazifa): Vazifa klassi yaratildi"
cat > manba/VazifaOmbori.php << 'EOF'
<?php
class VazifaOmbori
{
private array $vazifalar = [];
private int $keyingiId = 1;
public function qosh(string $matn, ?string $muddat = null): Vazifa
{
$vazifa = new Vazifa($this->keyingiId++, $matn, false, $muddat);
$this->vazifalar[$vazifa->id] = $vazifa;
return $vazifa;
}
public function top(int $id): ?Vazifa
{
return $this->vazifalar[$id] ?? null;
}
public function hammasi(): array
{
return array_values($this->vazifalar);
}
public function ochir(int $id): bool
{
if (!isset($this->vazifalar[$id])) {
return false;
}
unset($this->vazifalar[$id]);
return true;
}
}
EOF
git add manba/VazifaOmbori.php
git commit -m "feat(ombor): vazifalarni saqlash klassi qo'shildi"
git push -u origin feature/vazifa-qoshish
gh pr create --title "Vazifa qo'shish imkoniyati" --body "Asosiy klasslar: Vazifa va VazifaOmbori"
Bosqich 5 - CI sozlash #
git switch main && git pull
git switch -c chore/ci
mkdir -p .github/workflows
# .github/workflows/tekshiruv.yml
name: Tekshiruv
on:
push:
branches: [main]
pull_request:
jobs:
sintaksis:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
- name: Sintaksis tekshiruvi
run: |
find manba public -name "*.php" -print0 \
| xargs -0 -n1 php -l
- name: Konflikt belgilari
run: |
if grep -rn "^<<<<<<< " --include="*.php" .; then
echo "Konflikt belgilari topildi"
exit 1
fi
testlar:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
- name: Testlar
run: php testlar/ishga_tushir.php
git add .github
git commit -m "chore(ci): sintaksis va test tekshiruvi qo'shildi"
git push -u origin chore/ci
gh pr create --fill
Bosqich 6 - konfliktni yaratish va hal qilish #
Ikki dasturchi bir vaqtda bir faylni o'zgartiradi:
Ikkala tarmoq ham Vazifa konstruktoriga yangi maydon qo'shadi -
ya'ni bir xil satr o'zgaradi. Konflikt kafolatlangan.
# Birinchi tarmoq: muhimlik maydoni
git switch main && git pull
git switch -c feature/muhimlik
# konstruktorga qo'shamiz: public string $muhimlik = 'oddiy',
git commit -am "feat(vazifa): muhimlik darajasi qo'shildi"
git push -u origin feature/muhimlik
# Ikkinchi tarmoq: kategoriya maydoni
git switch main
git switch -c feature/kategoriya
# xuddi shu joyga qo'shamiz: public ?string $kategoriya = null,
git commit -am "feat(vazifa): kategoriya maydoni qo'shildi"
git push -u origin feature/kategoriya
Birinchisi merge qilindi. Ikkinchisini yangilaymiz:
git switch feature/kategoriya
git fetch origin
git rebase origin/main
CONFLICT (content): Merge conflict in manba/Vazifa.php
# Faylni oching, ikkala maydonni ham qoldiring
nano manba/Vazifa.php
git add manba/Vazifa.php
git rebase --continue
git push --force-with-lease
Konflikt - jamoaviy ishning normal qismi. Uni hal qilishni bilish Git dagi eng amaliy mahoratlardan biri.
Diqqat qiling: --force-with-lease, --force emas.
Bosqich 7 - tarixni tozalash #
PR dan oldin tarmoq tarixini ko'ring:
git log --oneline origin/main..HEAD
9f2a4c8 typo
3d7b1e5 yana tuzatish
8c4f2a9 xxx
5e1d8b3 feat(filtr): kategoriya bo'yicha filtrlash
Tozalaymiz:
git rebase -i origin/main
pick 5e1d8b3 feat(filtr): kategoriya bo'yicha filtrlash
fixup 8c4f2a9 xxx
fixup 3d7b1e5 yana tuzatish
fixup 9f2a4c8 typo
git log --oneline origin/main..HEAD
b7e3f1a feat(filtr): kategoriya bo'yicha filtrlash
git push --force-with-lease
Bosqich 8 - reliz #
git switch main && git pull
cat > CHANGELOG.md << 'EOF'
# O'zgarishlar jurnali
## [1.0.0] - 2026-06-20
### Qo'shildi
- Vazifa qo'shish, tahrirlash va o'chirish
- Bajarilgan deb belgilash
- Muddat va muhimlik darajasi
- Kategoriya bo'yicha filtrlash
- Avtomatik sintaksis tekshiruvi (CI)
EOF
git add CHANGELOG.md
git commit -m "docs: 1.0.0 uchun o'zgarishlar jurnali"
git push
git tag -a v1.0.0 -m "Birinchi barqaror reliz"
git push origin v1.0.0
gh release create v1.0.0 --title "v1.0.0 - Birinchi reliz" --generate-notes
Bosqich 9 - shoshilinch tuzatish #
Ishlab chiqarishda xato topildi: kechikkan vazifalar noto'g'ri belgilanmoqda.
git switch -c hotfix/1.0.1 v1.0.0
// Xato: bajarilgan vazifa ham kechikkan deb ko'rsatilardi
public function kechikkanmi(): bool
{
if ($this->muddat === null || $this->bajarildi) {
return false;
}
return strtotime($this->muddat) < time();
}
git commit -am "fix(vazifa): bajarilgan vazifa kechikkan deb ko'rsatilmaydi"
git tag -a v1.0.1 -m "Kechikish hisobi tuzatildi"
git push origin hotfix/1.0.1 v1.0.1
# main ga ham qo'llash
git switch main
git merge hotfix/1.0.1
git push
Yakuniy tarix #
git log --oneline --graph --decorate --all -15
* 4b8e2a1 (HEAD -> main, tag: v1.0.1) Merge branch 'hotfix/1.0.1'
|\
| * 7c2f9d4 (hotfix/1.0.1) fix(vazifa): bajarilgan vazifa kechikkan deb...
* | 9a3e5b7 docs: 1.0.0 uchun o'zgarishlar jurnali
|/
* c1d8f2a (tag: v1.0.0) feat(filtr): kategoriya bo'yicha filtrlash
* 5e7b3c9 feat(vazifa): kategoriya maydoni qo'shildi
* 2f9a4d1 feat(vazifa): muhimlik darajasi qo'shildi
* 8b3e7f0 chore(ci): sintaksis va test tekshiruvi qo'shildi
* 6d1c9a4 feat(ombor): vazifalarni saqlash klassi qo'shildi
* 3a8f5b2 feat(vazifa): Vazifa klassi yaratildi
* 1e4d7c8 docs: loyiha hujjatlari qo'shildi
* 9f2b6a3 chore: loyiha sozlamalari qo'shildi
Toza, o'qilishi oson tarix. Har bir kommit nima qilganini aytadi.
Buyruqlar xulosasi #
Tekshiruv ro'yxati #
| Bosqich | Nima o'rganildi |
|---|---|
| Repozitoriy yaratish | init, .gitignore, .editorconfig |
| Hujjatlar | README, CONTRIBUTING, LICENSE |
| GitHub ga ulash | remote add, push -u, tarmoq himoyasi |
| Tarmoqda ishlash | switch -c, kichik kommitlar |
| Pull Request | gh pr create, kod tekshiruvi |
| CI | GitHub Actions, avtomatik tekshiruv |
| Konflikt | rebase, konfliktni hal qilish |
| Tarixni tozalash | rebase -i, fixup |
| Reliz | tag -a, CHANGELOG, GitHub Release |
| Hotfix | tegdan tarmoq, merge |
Butun tsiklni o'zingiz boshidan oxirigacha bajaring:
- Yangi repozitoriy yarating va to'liq sozlang.
- README, CONTRIBUTING, LICENSE,
.gitignore,.editorconfigyozing. - GitHub ga yuklang va
mainni himoyalang. - Uchta imkoniyat uchun uchta tarmoq yarating.
- Har biri uchun PR oching va o'zingiz tekshirib merge qiling.
- Ataylab konflikt yarating va uni
rebasebilan hal qiling. - Iflos tarixli tarmoq yarating va
rebase -ibilan tozalang. - GitHub Actions bilan sintaksis tekshiruvini sozlang.
v1.0.0tegini qo'ying va Release chiqaring.- Xato toping,
hotfixtarmog'ida tuzating vav1.0.1chiqaring. git log --oneline --graph --allbilan yakuniy tarixni ko'ring.- Do'stingizni loyihaga taklif qiling va uning PR ini tekshiring.
Yakuniy xulosa #
Yigirma bo'lim davomida siz quyidagilarni o'rgandingiz:
- Versiya nazorati nima va Git nima uchun taqsimlangan
- O'rnatish va sozlash:
user.name,autocrlf,alias - Asosiy tsikl:
add,commit,status, uch hudud - Git ichki tuzilishi: blob, tree, commit, SHA-1, HEAD
- Tarixni ko'rish:
log,diff,show,blame - Fayllarni boshqarish va
.gitignore - Bekor qilish:
restore,reset,revert,amend,reflog - Tarmoqlar va ularning arzonligi
- Merge va konfliktlarni hal qilish
- Masofaviy repozitoriylar:
clone,push,fetch,pull - GitHub: SSH kalitlar, Issues, Pages, CLI
- Pull Request va kod tekshiruvi odobi
- Rebase va oltin qoida
- Stash va cherry-pick
- Teglar, semantik versiyalash va relizlar
- Ish oqimi modellari: GitHub Flow, Git Flow, trunk-based
bisectbilan xato qidirish- Hooks va GitHub Actions bilan avtomatlashtirish
- Jamoaviy ish qoidalari va xavfsizlik
Git ni faqat amaliyotda o'zlashtirasiz. Har kuni ishlating:
- Har bir loyihangizni Git ga qo'ying - eng kichigini ham
- Ochiq loyihaga hissa qo'shing -
good first issuebilan boshlang - Jamoada ishlang - do'stingiz bilan birgalikda loyiha yarating
- Xato qilishdan qo'rqmang -
reflogdeyarli hamma narsani qaytaradi
Bir oydan keyin bu buyruqlar barmoqlaringiz ostida bo'ladi.
| Manba | Nima uchun |
|---|---|
git help <buyruq> | Rasmiy hujjat, eng ishonchli |
| git-scm.com/book | "Pro Git" kitobi, bepul |
| learngitbranching.js.org | Interaktiv vizual mashqlar |
| ohshitgit.com | "Nima qilaman?" holatlari uchun |
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.