Merge — bu nima, birlashtirish turlari va ishlash mexanizmi

Muallif: IT Sectr Nashr etilgan: 2026-05-10 O'qish vaqti: 10 daq

Merge — Git-da bir shoxdan ikkinchisiga o'zgarishlarni birlashtiruvchi, birlashtirish commitini (merge commit) yaratuvchi operatsiyadir. Git bir nechta strategiyalarni qo'llab-quvvatlaydi: fast-forward (chiziqli tarix), three-way merge (merge commit yaratish bilan) va squash merge (barcha commitlarni bittaga siqish). git-scm.com, 2025 ma'lumotlariga ko'ra, merge jamoaviy Git ishlanmasida kod integratsiyasining eng ko'p qo'llaniladigan mexanizmi bo'lib qolmoqda.

Asosiy

  • Merge — Git-da birlashtirish commiti bilan yoki unsiz shoxlarni birlashtirish operatsiyasi
  • Fast-forward merge — farqlanish bo'lmaganda qo'shimcha commitsiz chiziqli birlashtirish
  • Three-way merge — shoxlar farqlanganda merge commit yaratadi
  • Squash merge — birlashtirishdan oldin barcha shox commitlarini bittaga siqadi
  • Qarama-qarshiliklar ikkala shoxda bir xil qatorlar o'zgartirilganda yuzaga keladi

Merge nima?

Merge (birlashtirish) — Git-da bir shoxdan (source) ikkinchisiga (target) o'zgarishlarni birlashtiruvchi asosiy operatsiyadir. Birlashtirish natijasida maqsadli shox manba shoxdan hali unda bo'lmagan barcha commitlarni oladi. Vaziyatga qarab, Git merge-ni uch xil usulda bajarishi mumkin.

Merge-ning asosiy qiymati — tarixni saqlash: merge commit shoxlarni birlashtirish faktini qayd etadi, qachon va qaysi shoxlar birlashtirilganligi haqida ma'lumotni saqlaydi. Bu o'zgarishlar auditini, regressiyalarni qidirishni va rivojlanish xronologiyasini tushunishni osonlashtiradi. Katta loyihalarda merge commit kod integratsiyasining standart usulidir.

GitLab Flow ma'lumotlariga ko'ra, merge commitlar Git bilan ishlaydigan jamoalarning 73 foizida qo'llaniladi. Muqobil yondashuvlarni (rebase, squash) chiziqli tarixga yo'naltirilgan jamoalar afzal ko'radi. Strategiya tanlash jamoa hajmiga, chiqarish chastotasiga va loyihada qabul qilingan kelishuvlarga bog'liq.

Merge qachon kerak

Merge talab qilinadi, qachonki dasturchi funksiya ustida ishni tugatib, uni develop yoki main-ga integratsiya qilmoqchi bo'lsa. Oddiy stsenariy: dasturchi develop-dan funksiya shoxini yaratdi, bir necha kun ishladi, bu vaqt ichida develop-da boshqa ishtirokchilar tomonidan yangi commitlar paydo bo'ldi. Birlashtirishdan oldin o'zgarishlarni birlashtirish kerak — va buning uchun merge ishlatiladi.

Merge-siz Git-da bitta kod ustida birgalikda ishlash mumkin emas. Har safar ikki dasturchi bir vaqtning o'zida bir kod bazasiga o'zgarishlar kiritganda, ularning shoxlari farqlanadi. Merge — bu o'zgarishlarni ma'lumot yo'qotmasdan qaytarib birlashtirishning yagona usulidir.

Git-da birlashtirish turlari

Git uch turdagi merge ni qo'llab-quvvatlaydi, har biri o'z stsenariysi uchun mo'ljallangan. Birlashtirish turini tanlash commitlar tarixiga, qaytarish qulayligiga va logning o'qilishiga ta'sir qiladi.

Fast-forward merge

Fast-forward maqsadli shox manba shox yaratilganidan beri yangi commitlarga ega bo'lmaganda yuzaga keladi. Bu holda Git oddiygina maqsadli shox ko'rsatkichini oldinga, manba shoxning oxirgi commitiga suradi. Tarix merge commitsiz chiziqli qoladi.

bash
# Fast-forward merge: develop feature yaratilganidan beri o'zgarmagan
git checkout develop
git merge feature/new-login

# Natija: develop ko'rsatkichi feature oxiriga o'tdi
# Hech qanday merge commit yaratilmadi

Fast-forward qisqa muddatli shoxlar uchun qulay, bunda dasturchi yolg'iz ishlagan. Ammo bu yondashuvning kamchiligi bor: shoxning mavjud bo'lganligi haqidagi ma'lumot yo'qoladi — barcha commitlar to'g'ridan-to'g'ri develop-da qilingandek ko'rinadi.

Three-way merge

Three-way merge ikkala shox farqlanish nuqtasidan keyin yangi commitlarga ega bo'lganda bajariladi. Git ikkita ota-onaga ega alohida merge commit yaratadi, bu shoxlarning birlashtirish faktini qayd etadi. Bu yondashuv jamoaviy ishda funksiya shoxlari uchun tavsiya etiladi.

bash
# --no-ff bayrog'i bilan majburiy three-way merge
git checkout develop
git merge --no-ff feature/new-login

# Standart xabar bilan merge commit yaratildi
# -m orqali o'z xabaringizni belgilashingiz mumkin
git merge --no-ff feature/new-login -m "Merge feature/new-login into develop"

--no-ff bayrog'i fast-forward mumkin bo'lsa ham, merge commit yaratilishini kafolatlaydi. Bu loyihada shoxlanish haqidagi ma'lumotni saqlash uchun eng yaxshi amaliyotdir.

Squash merge

Squash merge manba shoxning barcha commitlarini bittaga siqadi va maqsadli shoxga qo'llaydi. Funksiya tarixi yo'qoladi — shoxga barcha o'zgarishlar bilan bitta commit tushadi. Bu funksiya shoxidagi batafsil commitlar umumiy tarix uchun qiymatga ega bo'lmaganda qulaydir.

bash
# Squash merge: feature-ning barcha commitlari bittaga siqildi
git checkout develop
git merge --squash feature/experimental
git commit -m "feat: experimental login flow (squashed)"

Squash qoralama, eksperimental shoxlar va tarixning tozaligini saqlash muhim bo'lgan holatlar uchun mos keladi. Minus — asl commitlar bilan bog'lanish yo'qoladi, bu alohida o'zgarishlarni qaytarishni qiyinlashtiradi.

Ours va Theirs strategiyalari

Ours va Theirs — Git-da ikkita maxsus merge strategiyasi. Ours manba shoxdan o'zgarishlarni butunlay e'tiborsiz qoldiradi, faqat maqsadli shoxda bo'lganlarni saqlaydi. Theirs esa aksincha, har qanday qarama-qarshilikda manba shoxning versiyasini qabul qiladi. Bu strategiyalar qaysi versiya g'alaba qozonishi oldindan ma'lum bo'lganda katta hajmdagi kodni birlashtirishda foydalidir.

Merge qanday ishlaydi

Git-da merge mexanizmi uch nuqtani solishtirishga asoslanadi: umumiy ajdod (merge base), manba shoxning holati va maqsadli shoxning holati. Git merge base-ni — ikkala shox uchun umumiy bo'lgan oxirgi commitni topadi va farqlanishdan keyin har bir shoxda qanday o'zgarishlar sodir bo'lganligini hisoblaydi.

  • 1-qadam — Git merge base-ni aniqlaydi: ikkala shoxda mavjud bo'lgan oxirgi commit
  • 2-qadam — Git ikkita diff quradi: merge base dan source ga va merge base dan target ga
  • 3-qadam — Git ikkala o'zgarishlar to'plamini merge base ga qo'llashga harakat qiladi
  • 4-qadam — O'zgarishlar ziddiyat bo'lmasa — merge avtomatik ravishda tugaydi
  • 5-qadam — Qarama-qarshilik bo'lsa — Git to'xtaydi va hal qilishni so'raydi

Git uch tomonlama birlashtirish algoritmidan foydalanadi, bu nafaqat ikkita solishtirilayotgan fayl versiyasini, balki ularning umumiy ajdodini ham hisobga oladi. Buning yordamida Git bir shoxdagi o'zgarishlar ikkinchisining o'zgartirilgan qismlariga ta'sir qilmagan holatlarni avtomatik hal qila oladi — hatto ikkala fayl ham o'zgartirilgan bo'lsa ham.

Merge algoritmining misol bilan ishlashi

Stsenariyni ko'rib chiqaylik: ikki dasturchi bir funksiya shoxida turli fayllar ustida ishlaydi. Birinchisi LoginActivity.kt-ni, ikkinchisi ProfileFragment.kt-ni o'zgartirdi. Ular o'z o'zgarishlarini birlashtirganda, Git o'zgarishlar turli fayllarga tegishli ekanligini ko'radi va inson aralashuvisiz avtomatik merge-ni bajaradi.

Agar ikkala dasturchi LoginActivity.kt-ni, lekin turli metodlarda o'zgartirgan bo'lsa — Git ham avtomatik tarzda uddasidan chiqadi, o'zgarishlarni qatorma-qator birlashtiradi. Qarama-qarshilik faqat ikkalasi bir xil qatorlarni o'zgartirganda yoki biri ikkinchisi o'zgartirgan kodni o'chirganda yuzaga keladi.

Merge vaqtida qarama-qarshiliklarni hal qilish

Merge qarama-qarshiligi Git o'zgarishlarni avtomatik birlashtira olmaganda yuzaga keladi, chunki ikkala shox bir xil qatorlarni turlicha o'zgartirgan. Bu holda Git fayllarda qarama-qarshilik qismlarini belgilaydi va dasturchidan qo'lda hal qilishni kutadi.

Qarama-qarshilik qismlari maxsus markerlar bilan belgilanadi: <<<<<<< HEAD maqsadli shoxdan kodni ko'rsatadi, ======= — ajratgich, >>>>>>> source-branch — manba shoxdan kodni. Dasturchi qaysi variantni saqlashni qo'lda tanlashi yoki ularni birlashtirishi kerak.

bash
# 1. Merge-ni ishga tushirish va qarama-qarshilikni ko'rish
git merge feature/new-login
# Natija: CONFLICT (content): Merge conflict in LoginActivity.kt

# 2. Qarama-qarshilikli fayllar ro'yxatini ko'rish
git status
# both modified: src/ui/login/LoginActivity.kt

# 3. Qarama-qarshilikni hal qilish: faylni tahrirlash, markerlarni olib tashlash
# 4. Hal qilingan faylni qo'shish va merge-ni tugatish
git add src/ui/login/LoginActivity.kt
git merge --continue
# yoki: git commit (--continue siz)

Qarama-qarshiliklarni hal qilish uchun vositalar mavjud: git mergetool vizual merger-ni ochadi (Meld, Beyond Compare, VS Code). Ko'plab dasturchilar qarama-qarshiliklarni IDE-da hal qilishni afzal ko'radi — IntelliJ IDEA va Android Studio uch panelli taqqoslash bilan o'rnatilgan vositani taqdim etadi, bu jarayonni sezilarli darajada osonlashtiradi.

Qarama-qarshiliklarni hal qilish bo'yicha maslahatlar: har doim qarama-qarshilikning har bir tomoni nima qilayotganini tushuning, boshqalarning kodini uning mantig'ini tushunmasdan o'chirmang va agar qarama-qarshilik juda murakkab bo'lsa — ikkala shox muallifini birgalikda hal qilishga jalb qiling.

Merge vs Rebase: qachon nima tanlash

Merge va Rebase o'rtasida tanlash — Git-dagi eng keng tarqalgan arxitektura qarorlaridan biridir. Ikkala yondashuv o'zgarishlarni birlashtiradi, ammo buni turlicha qiladi: merge shoxlanish tarixini saqlaydi, rebase tarixni qayta yozib, uni chiziqli qiladi.

  • Merge — kontekstni saqlaydi: qachon va qaysi shoxdan birlashtirish amalga oshirilganligi ko'rinadi. Ommaviy shoxlar (develop, main) va jamoa ishi uchun yaxshiroq
  • Rebase — ortiqcha merge commitlarsiz toza chiziqli tarix yaratadi. Ko'rib chiqishga yuborishdan oldin shaxsiy funksiya shoxlari uchun yaxshiroq
  • Qoida: boshqa dasturchilar foydalanadigan ommaviy shoxlarni hech qachon rebase qilmang

Ko'plab jamoalar gibrid yondashuvdan foydalanadi: funksiya shoxini develop-ning joriy holatiga keltirish uchun rebase (git rebase develop), so'ngra birlashtirishni qayd etish uchun --no-ff bayrog'i bilan merge. Bu funksiya ichida toza tarix va develop darajasida ma'lumot beruvchi birlashtirish nuqtalarini beradi.

Tez-tez beriladigan savollar

Merge va merge --no-ff o'rtasidagi farq nima?

--no-ff siz Git imkon bo'lganda fast-forward merge-ni bajaradi — oddiygina shox ko'rsatkichini suradi. --no-ff bilan Git har doim merge commit yaratadi, shoxlanish haqidagi ma'lumotni saqlaydi. Jamoa ishida funksiya shoxlari uchun tavsiya etiladi.

Merge qarama-qarshiligi juda katta bo'lsa nima qilish kerak?

Git mergetool dan foydalaning yoki IDE ning o'rnatilgan vositasidan. Agar qarama-qarshilik o'nlab fayllarga ta'sir qilsa — ehtimol shoxlar juda ko'p farqlangan. Bunday holda jamoa bilan birlashtirish rejasini muhokama qilish, ehtimol uni bir necha bosqichga bo'lish kerak.

Merge-ni bekor qilish mumkinmi?

Ha: git merge --abort merge-ni bekor qiladi, agar u hali tugamagan bo'lsa (qarama-qarshilik). Merge allaqachon tugagan bo'lsa — xavfsiz qaytarish uchun git reset --hard HEAD~1 yoki git revert -m 1 <merge-commit> dan foydalaning.

Har bir funksiya uchun merge commit yaratish kerakmi?

Jamoa ishi uchun tavsiya etiladi. Merge commit birlashtirish faktini qayd etadi, ikkala shoxga havolalarni o'z ichiga oladi va tarixni tushunishni osonlashtiradi. Shaxsiy yoki eksperimental shoxlar uchun squash merge yoki fast-forward maqbuldir.

Merge ikkilik fayllar bilan qanday ishlaydi?

Git ikkilik fayllarni avtomatik birlashtira olmaydi — versiyalardan birini butunlay tanlaydi. Ikkilik fayllar (tasvirlar, .aab, .apk) uchun parallel o'zgarishlarni minimallashtirish va katta fayllar uchun Git LFS dan foydalanish tavsiya etiladi.

Xulosa

  • Merge — bir shoxdan ikkinchisiga o'zgarishlarni birlashtirish uchun Git-ning asosiy operatsiyasi
  • Fast-forward — farqlanish bo'lmaganda merge commitsiz chiziqli birlashtirish
  • Three-way merge — ikkita ota-onali merge commit yaratadi, kontekstni saqlaydi
  • Squash merge — barcha shox commitlarini bittaga siqadi, funksiya tarixini yo'qotadi
  • Qarama-qarshiliklar bir xil qatorlar o'zgartirilganda yuzaga keladi va qo'lda hal qilinadi
  • Merge Rebase-dan farq qiladi: birinchisi shoxlanishni saqlaydi, ikkinchisi tarixni chiziqli qiladi
  • Ommaviy shoxlar uchun --no-ff bilan merge tavsiya etiladi, shaxsiy uchun — rebase yoki squash

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing