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 (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 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 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 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.
# 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 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.
# --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 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.
# 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 — 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.
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.
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.
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 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.
# 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 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.
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
--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.
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.
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.
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.
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
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.