- Published on
Git: rebase va merge farqi — qachon nimadan foydalanish kerak
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
Oldingi darslarda branching va merging ko'rildi. Bu darsda merging-ga o'xshab lekin ichki mexanizmi jihatidan farqlanadigan amal — rebase ko'rib chiqiladi.
Muhim: Xcode Source Control rebase-ni qo'llab-quvvatlamaydi. Bu amal uchun Git Kraken yoki boshqa GUI vositasi, yoki terminal kerak bo'ladi.
Merge va rebase — tushuncha
Merge
Branch-dan commit-lar kiritiladi, keyin ular main-ga birlashtiriladi. Original commit-lar va ularning vaqt belgilari o'zgarmaydi. Tarix shunday ko'rinadi:
main: A --- B --- C ----------- M
\ /
branch: D --- E ---
M — merge commit, D va E o'zlarining original vaqt belgilari bilan saqlanib qoladi.
Rebase
Branch-dagi commit-lar main-ning eng oxiriga ko'chiriladi — sanasi va asosi o'zgaradi:
Oldin:
main: A --- B --- C
\
branch: D --- E
Keyin (rebase):
main: A --- B --- C --- D' --- E'
D' va E' — yangi commit-lar (original D va E emas), chunki ularning asosi o'zgardi. Keyinchalik merge qilinganda hech qanday conflict bo'lmaydi, chunki barcha tarix xronologik tartibda.
Rebase afzalligi
Merge conflict-larini kamaytirishning eng samarali usuli. Rebase qilingandan so'ng, main-ga merge qilganda conflict yuz berish ehtimoli amalda nolga teng — chunki branch endi main-ning eng so'nggi holatidan boshlanadi.
Bundan tashqari, git tarixi toza va chiziqli bo'lib qoladi — bu katta loyihalarda tarixni o'qishni osonlashtiradi.
Rebase amalga oshirish (Git Kraken)
- Source Control-da branchni ko'ring
mainustiga o'ng tugma bosingRebase [branch-nomi] onto maintanlang
Rebase muvaffaqiyatli amalga oshirilgandan so'ng, branch endi main-ning tepasidan boshlanadi.
Force push
Rebase qilingandan so'ng remote-ga oddiy push ishlamaydi — chunki tarix o'zgardi va remote versiya bilan mos kelmasligi mumkin. Bu holda force push kerak:
Push → Force push
Ogohlantirish: Force push — remote-dagi branch tarixini to'liq qayta yozadi. Force push qilingan branchning oldingi versiyasi qaytarib bo'lmaydi. Shuning uchun rebase qilingandan so'ng, push qilishdan oldin loyiha to'g'ri compilatsiya qilishini tekshirish tavsiya etiladi.
Interactive rebase
Git Kraken-da mavjud ilg'or xususiyat — faqat tanlangan commit-larni rebase qilish imkonini beradi:
- Branch ustiga o'ng tugma →
Interactive Rebase - Har bir commit uchun:
pick(rebase qil) yokidrop(tashlab qo'y) Start Rebase
Bu faqat zarur commit-larni ko'chirishga va qolganlarini asl joyida qoldirishga imkon beradi.
Rebase paytida conflict
Rebase paytida ham conflict yuz berishi mumkin — agar main va branch-da bir xil fayl, bir xil qator o'zgartirilgan bo'lsa. Conflict hal qilish tartibi merge bilan bir xil:
- Conflict bor faylni oching
- Kerakli versiyani tanlang yoki ikkalasini birlashtiring
- Saqlang
Continue Rebase
Conflict hal qilingandan so'ng rebase davom etadi.
Merge va rebase — qaysi birini tanlash
| Mezon | Merge | Rebase |
|---|---|---|
| Git tarixi | Xronologik, branchlar ko'rinadi | Chiziqli, toza |
| Original commit-lar | Saqlanib qoladi | O'zgaradi (yangi hash) |
| Merge conflict ehtimoli | Yuqori (branch eski versiyadan) | Past (branch eng so'nggidan) |
| Xcode qo'llab-quvvatlashi | ✅ Ha | ❌ Yo'q |
| Force push kerakmi | Yo'q | Ha |
| Git tarixini o'chirish xavfi | Yo'q | Bor (force push) |
Qachon rebase, qachon merge
Rebase qulay bo'lganda:
- Shaxsiy branch ustida ishlash
- Merge conflict-larni oldindan bartaraf etish
- Git tarixini toza saqlash
Merge ishlatilishi kerak bo'lganda:
- Bir nechta kishi bilan birgalikda ishlanayotgan shared branch
- Original commit tarixi saqlanishi muhim bo'lganda
- Jamoada rebase ishlatilmasa
Tavsiya etiladigan ish jarayoni
Rebase ishlatilganda odatdagi ketma-ketlik:
1. Branch yarating (main-dan)
2. Commit-lar qiling
3. Rebase: branchni main-ning tepasiga ko'chiring
4. Xcode-da compilatsiya tekshiring
5. Force push (remote branch yangilanadi)
6. Main-ga merge qiling (conflict yo'q)
7. Main-ni push qiling
8. Eski branchni o'chiring
Xulosa
Bu darsda o'rganildi:
- Rebase — branch commit-larini main-ning eng oxiriga ko'chiradi, yangi commit-lar hosil qiladi
- Merge — original commit-lar saqlanadi, tarix xronologik
- Rebase keyin merge conflict ehtimoli amalda nolga teng
- Force push — rebase qilingandan so'ng majburiy, ammo xavfli
- Interactive rebase — faqat tanlangan commit-larni rebase qilish imkonini beradi
- Xcode rebase-ni qo'llab-quvvatlamaydi — Git Kraken yoki terminal kerak
- Ikkalasi ham to'g'ri — jamoa qaysi usulni standart qilib belgilagan bo'lsa, shu ishlatiladi
Keyingi darsda git flow va yanada murakkab ish jarayonlari ko'rib chiqiladi.