20-bo‘lim

Amaliy loyiha - jamoaviy ish oqimi

O'rganilgan barcha bilimlarni birlashtirib, boshidan oxirigacha to'liq loyiha tsiklini bajarish.

🕑 18 daqiqa o‘qish 📄 793 so‘z 👁 5 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Loyiha topshirig'i
  2. Bosqich 1 - loyihani boshlash
  3. Bosqich 2 - hujjatlar
  4. Bosqich 3 - GitHub ga ulash
  5. Bosqich 4 - birinchi imkoniyat
  6. Bosqich 5 - CI sozlash
  7. Bosqich 6 - konfliktni yaratish va hal qilish
  8. Bosqich 7 - tarixni tozalash
  9. Bosqich 8 - reliz
  10. Bosqich 9 - shoshilinch tuzatish
  11. Yakuniy tarix
  12. Buyruqlar xulosasi
  13. Tekshiruv ro'yxati
  14. Yakuniy xulosa

Yigirma bo'lim davomida o'rgangan hamma narsani bitta amaliy loyihada birlashtiramiz - repozitoriy yaratishdan reliz chiqarishgacha.

Loyiha topshirig'i #

Vazifa

Kichik "Vazifalar ro'yxati" ilovasi ustida jamoada ishlash tsiklini to'liq bajaring:

  1. Repozitoriy yaratish va sozlash
  2. To'g'ri hujjatlar va .gitignore
  3. Ish oqimini tanlash va yozib qo'yish
  4. Tarmoqda ishlash, PR, kod tekshiruvi
  5. Konfliktni hal qilish
  6. Tarixni tozalash
  7. CI sozlash
  8. Reliz chiqarish
  9. Shoshilinch tuzatish

Bosqich 1 - loyihani boshlash #

Terminal
mkdir vazifalar && cd vazifalar
git init
git branch -M main

Asosiy sozlamalar:

Terminal
git config user.name "Husanboy Qodirov"
git config user.email "[email protected]"

Boshlang'ich fayllar:

Terminal
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
Terminal
git add .gitignore .editorconfig
git commit -m "chore: loyiha sozlamalari qo'shildi"

Bosqich 2 - hujjatlar #

README.md:

MARKDOWN
# 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:

MARKDOWN
# 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
Terminal
git add README.md CONTRIBUTING.md LICENSE
git commit -m "docs: loyiha hujjatlari qo'shildi"

Bosqich 3 - GitHub ga ulash #

Terminal
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 #

Terminal
git switch -c feature/vazifa-qoshish
Terminal
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"
Terminal
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"
Terminal
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 #

Terminal
git switch main && git pull
git switch -c chore/ci
mkdir -p .github/workflows
YAML
# .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
Terminal
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.

Terminal
# 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:

Terminal
git switch feature/kategoriya
git fetch origin
git rebase origin/main
Natija
CONFLICT (content): Merge conflict in manba/Vazifa.php
Terminal
# Faylni oching, ikkala maydonni ham qoldiring
nano manba/Vazifa.php

git add manba/Vazifa.php
git rebase --continue
git push --force-with-lease
Bu eng muhim ko'nikma

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:

Terminal
git log --oneline origin/main..HEAD
Natija
9f2a4c8 typo
3d7b1e5 yana tuzatish
8c4f2a9 xxx
5e1d8b3 feat(filtr): kategoriya bo'yicha filtrlash

Tozalaymiz:

Terminal
git rebase -i origin/main
Natija
pick  5e1d8b3 feat(filtr): kategoriya bo'yicha filtrlash
fixup 8c4f2a9 xxx
fixup 3d7b1e5 yana tuzatish
fixup 9f2a4c8 typo
Terminal
git log --oneline origin/main..HEAD
Natija
b7e3f1a feat(filtr): kategoriya bo'yicha filtrlash
Terminal
git push --force-with-lease

Bosqich 8 - reliz #

Terminal
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.

Terminal
git switch -c hotfix/1.0.1 v1.0.0
PHP
// 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();
}
Terminal
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 #

Terminal
git log --oneline --graph --decorate --all -15
Natija
*   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 #

Kundalik ishda kerak bo'ladigan buyruqlar Asosiy git status git add . git commit -m "..." git log --oneline git diff Tarmoqlar git switch -c nom git switch main git merge nom git rebase main git branch -d nom Masofaviy git clone URL git pull git push git fetch --prune git remote -v Bekor qilish git restore fayl git restore --staged git reset --soft HEAD~1 git revert xesh Qutqaruv git reflog git stash git bisect start git cherry-pick xesh Relizlar git tag -a v1.0.0 git push --tags git describe --tags gh release create
Bu buyruqlar kundalik ishning 95 foizini qoplaydi

Tekshiruv ro'yxati #

BosqichNima o'rganildi
Repozitoriy yaratishinit, .gitignore, .editorconfig
HujjatlarREADME, CONTRIBUTING, LICENSE
GitHub ga ulashremote add, push -u, tarmoq himoyasi
Tarmoqda ishlashswitch -c, kichik kommitlar
Pull Requestgh pr create, kod tekshiruvi
CIGitHub Actions, avtomatik tekshiruv
Konfliktrebase, konfliktni hal qilish
Tarixni tozalashrebase -i, fixup
Reliztag -a, CHANGELOG, GitHub Release
Hotfixtegdan tarmoq, merge
Yakuniy topshiriq

Butun tsiklni o'zingiz boshidan oxirigacha bajaring:

  1. Yangi repozitoriy yarating va to'liq sozlang.
  2. README, CONTRIBUTING, LICENSE, .gitignore, .editorconfig yozing.
  3. GitHub ga yuklang va main ni himoyalang.
  4. Uchta imkoniyat uchun uchta tarmoq yarating.
  5. Har biri uchun PR oching va o'zingiz tekshirib merge qiling.
  6. Ataylab konflikt yarating va uni rebase bilan hal qiling.
  7. Iflos tarixli tarmoq yarating va rebase -i bilan tozalang.
  8. GitHub Actions bilan sintaksis tekshiruvini sozlang.
  9. v1.0.0 tegini qo'ying va Release chiqaring.
  10. Xato toping, hotfix tarmog'ida tuzating va v1.0.1 chiqaring.
  11. git log --oneline --graph --all bilan yakuniy tarixni ko'ring.
  12. 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
  • bisect bilan xato qidirish
  • Hooks va GitHub Actions bilan avtomatlashtirish
  • Jamoaviy ish qoidalari va xavfsizlik
Keyingi qadam

Git ni faqat amaliyotda o'zlashtirasiz. Har kuni ishlating:

  1. Har bir loyihangizni Git ga qo'ying - eng kichigini ham
  2. Ochiq loyihaga hissa qo'shing - good first issue bilan boshlang
  3. Jamoada ishlang - do'stingiz bilan birgalikda loyiha yarating
  4. Xato qilishdan qo'rqmang - reflog deyarli hamma narsani qaytaradi

Bir oydan keyin bu buyruqlar barmoqlaringiz ostida bo'ladi.

Foydali manbalar
ManbaNima uchun
git help <buyruq>Rasmiy hujjat, eng ishonchli
git-scm.com/book"Pro Git" kitobi, bepul
learngitbranching.js.orgInteraktiv vizual mashqlar
ohshitgit.com"Nima qilaman?" holatlari uchun

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.