# Git for iOS Developers — To'liq Darslik

## Mundarija
1. [Git nima va nega kerak?](#motivatsiya)
2. [Git o'rnatish va sozlash](#setup)
3. [Asosiy buyruqlar (init, add, commit)](#basic-commands)
4. [Branch (Tarmoqlanish)](#branching)
5. [Merge va Rebase](#merge-rebase)
6. [Remote Repository (GitHub, GitLab)](#remote)
7. [Pull Request (PR) va Code Review](#pull-request)
8. [Git Workflow'lar (GitFlow)](#workflows)
9. [`.gitignore` — iOS loyiha uchun muhim qadam](#gitignore)
10. [Merge Conflict hal qilish (xcodeproj muammosi)](#conflicts)
11. [Git Stash va Cherry-pick](#advanced)
12. [Xulosa](#xulosa)

---

## 1. Git nima va nega kerak? {#motivatsiya}

Git — bu **Versiyalarni boshqarish tizimi** (Version Control System).
- **Vaqt mashinasi:** Loyihaning istalgan oldingi holatiga qaytish mumkin.
- **Jamoaviy ish:** Bir nechta dasturchi bitta faylda parallel ishlashi mumkin.
- **Tajriba maydoni:** Asosiy kodni buzmasdan yangi funksiyalarni test qilib ko'rish mumkin.

---

## 2. Git o'rnatish va sozlash {#setup}

Terminalda quyidagilarni sozlang:
```bash
git config --global user.name "Sizning Ismingiz"
git config --global user.email "sizning@emailingiz.com"
```

---

## 3. Asosiy buyruqlar {#basic-commands}

1. **`git init`**: Yangi loyihada gitni boshlash.
2. **`git status`**: O'zgarishlarni ko'rish.
3. **`git add .`**: Barcha o'zgarishlarni "staging" (tayyorgarlik) maydoniga o'tkazish.
4. **`git commit -m "Xabar"`**: O'zgarishlarni muhrlash.
5. **`git log`**: Tarixni ko'rish.

---

## 4. Branch (Tarmoqlanish) {#branching}

Asosiy kod (`main`) doimo barqaror bo'lishi kerak. Har bir yangi funksiya uchun alohida tarmoq ochiladi.

```bash
git checkout -b feature/login-screen # Yangi branch ochish va unga o'tish
git switch main # Main branch'ga qaytish
```

---

## 5. Merge va Rebase {#merge-rebase}

- **Merge:** Ikki tarmoq tarixini birlashtiradi. Tarixda birlashgan nuqta ko'rinadi.
- **Rebase:** Ishingizni xuddi `main` ning oxiridan boshlangandek qilib ko'chiradi. Tarixni toza saqlaydi.

---

## 6. Remote Repository (GitHub, GitLab) {#remote}

Loyihangiz serverda (cloud) saqlanishi kerak:
```bash
git remote add origin https://github.com/user/project.git
git push -u origin main # Serverga yuklash
git pull # Serverdan yangi o'zgarishlarni olish
```

---

## 7. Pull Request (PR) va Code Review {#pull-request}

Siz yozgan kodni jamoa ko'rib chiqishi (review) uchun PR ochasiz. Senior dasturchilar "Approved" bergandan keyingina kod `main` ga qo'shiladi.

---

## 8. Git Workflow'lar (GitFlow) {#workflows}

- **GitFlow:** `master`, `develop`, `feature`, `release`, `hotfix` branchlari bilan ishlash tizimi.
- **Trunk-based:** Kamroq branch, tez-tez `main` ga merge qilish.

---

## 9. `.gitignore` — iOS loyiha uchun muhim qadam {#gitignore}

Har bir iOS loyihada ba'zi fayllar serverga yuklanmasligi shart (masalan, `DerivedData`, `Pods`, `.DS_Store`). Buning uchun loyiha ildizida `.gitignore` fayli bo'lishi kerak.

---

## 10. Merge Conflict hal qilish (xcodeproj muammosi) {#conflicts}

Eng ko'p uchraydigan muammo — `.xcodeproj` faylidagi konflikt.
- **Yechim:** Konfliktni terminal yoki Xcode ning o'zida hal qiling. Murakkab bo'lsa, **Tuist** kabi vositalaridan foydalanib konfliktlarni butunlay yo'q qilish mumkin.

---

## 11. Git Stash va Cherry-pick {#advanced}

- **Stash:** O'zgarishlarni commit qilmasdan vaqtincha bir chekkaga olib qo'yish.
- **Cherry-pick:** Boshqa branchdagi bitta aniq commitni o'z branchingizga ko'chirib olish.

---

## 12. Xulosa {#xulosa}

Git bilmagan dasturchi — professional emas.
- Branch nomlarini chiroyli qo'ying (`feature/`, `bugfix/`).
- Commit xabarlarini tushunarli yozing.
- Tez-tez `pull` qilib turishni unutmang!

**Vazifa:** GitHub'da repozitoriy oching va birinchi iOS loyihangizni yuklang! 🐙
