Published on

Git: rebase va merge farqi — qachon nimadan foydalanish kerak

Authors

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)

  1. Source Control-da branchni ko'ring
  2. main ustiga o'ng tugma bosing
  3. Rebase [branch-nomi] onto main tanlang

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:

PushForce 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:

  1. Branch ustiga o'ng tugma → Interactive Rebase
  2. Har bir commit uchun: pick (rebase qil) yoki drop (tashlab qo'y)
  3. 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:

  1. Conflict bor faylni oching
  2. Kerakli versiyani tanlang yoki ikkalasini birlashtiring
  3. Saqlang
  4. Continue Rebase

Conflict hal qilingandan so'ng rebase davom etadi.


Merge va rebase — qaysi birini tanlash

MezonMergeRebase
Git tarixiXronologik, branchlar ko'rinadiChiziqli, toza
Original commit-larSaqlanib qoladiO'zgaradi (yangi hash)
Merge conflict ehtimoliYuqori (branch eski versiyadan)Past (branch eng so'nggidan)
Xcode qo'llab-quvvatlashi✅ Ha❌ Yo'q
Force push kerakmiYo'qHa
Git tarixini o'chirish xavfiYo'qBor (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.

Buy mea coffee