Bosh sahifa Wiki Merge

Merge

Merge — Gitda ikki yoki undan ortiq rivojlanish tarixini bitta branch tarixida birlashtirish amali. Odatda feature branchdagi commitlar main branchga qo‘shiladi. Git branchlarning umumiy ajdodini topib, har tomondagi o‘zgarishlarni uch tomonlama taqqoslaydi va natijaga qarab fast-forward yoki merge commit yaratadi.

Fast-forward

Agar qabul qiluvchi branch ajralgandan beri yangi commit olmagan bo‘lsa, uning pointeri feature branchning oxirgi commitiga oldinga suriladi. Yangi commit yaratilmaydi.

A---B  main
     \
      C---D  feature

Main hali Bda bo‘lsa, merge’dan keyin u Dga ko‘chadi. Tarix chiziqli qoladi. --no-ff sozlamasi fast-forward mumkin bo‘lsa ham alohida merge commit yaratadi va feature integratsiyasini tarixda ko‘rsatadi.

Uch tomonlama merge

Ikkala branch umumiy ajdoddan keyin o‘zgargan bo‘lsa, Git base, current branch va birlashtirilayotgan branch snapshotlarini solishtiradi. O‘zgarishlar turli joyda bo‘lsa avtomatik birlashtiriladi. Natija odatda ikki parentga ega merge commit bo‘ladi.

git switch main
git merge feature

Merge commit xabari integratsiya sababini ifodalashi mumkin. Commitning birinchi parenti qabul qiluvchi branch, ikkinchisi qo‘shilgan tarix bo‘ladi. Bu revert va log ko‘rinishida muhim.

Conflict

Bir xil satr yoki Git avtomatik moslashtira olmaydigan bog‘liq qismlar ikki tomonda o‘zgarsa conflict yuz beradi. Working tree faylida conflict markerlar paydo bo‘ladi. Dasturchi faqat “ours” yoki “theirs”ni tanlamasdan, yakuniy mantiqni tekshiradi.

git status
git add resolved-file
git commit

git merge --abort muvaffaqiyatsiz merge’ni oldingi holatga qaytarishga urinadi. Uncommitted lokal o‘zgarishlar jarayonni murakkablashtirishi mumkin, shuning uchun merge oldidan ish holati tekshiriladi.

Merge strategiyalari

Default ort strategiyasi odatiy branch merge’lari uchun ishlatiladi. ours strategiyasi barcha boshqa tarixni parent sifatida bog‘lab, current tree’ni saqlaydi; bu fayl conflictidagi “ours” optionidan boshqa tushuncha. Octopus merge bir nechta branchni bir commitda birlashtirishi mumkin, murakkab conflict bo‘lsa odatda ishlamaydi.

Hosting platformasidagi pull request “merge commit”, “squash and merge” yoki “rebase and merge” variantlarini taklif qilishi mumkin. Squash feature commitlarini bitta yangi commitga aylantiradi va asl commit IDlar main tarixiga kirmaydi.

Tekshirish

Avtomatik merge sintaktik conflict yo‘qligini bildiradi, biznes mantiqi to‘g‘riligini emas. Bir branch function signature’ni, boshqasi caller’ni mos kelmaydigan tarzda o‘zgartirishi mumkin. Test, lint va status checks integratsiya natijasida bajariladi. Merge’dan keyin build artefakti aynan birlashtirilgan commitdan yaratiladi.

Merge commit semantikasi

Merge commit odatda ikki parentga ega: birinchi parent merge bajarilgan branchning avvalgi uchi, ikkinchisi esa qo‘shilayotgan branch uchi. Shu ma’lumot Gitga ikki rivojlanish yo‘li qayerda birlashganini ko‘rsatadi. git log --first-parent asosiy branchdagi integratsiyalarni ixcham ko‘rish uchun birinchi parent bo‘ylab yuradi. Merge natijasini revert qilishda -m parametri aynan qaysi parent asosiy yo‘nalish sifatida saqlanishini bildiradi. Noto‘g‘ri parent tanlansa, kutilganidan boshqa o‘zgarishlar qaytarilishi mumkin. Merge commit xabari integratsiya sababini bayon qilsa, keyinchalik tarixni audit qilish va regressiya manbasini topish osonlashadi.

Merge natijasi testdan o‘tsa ham, birlashish tartibi runtime xatti-harakatiga ta’sir qilishi mumkin. Masalan, ikki branch alohida migratsiya raqami yaratgan bo‘lsa, matn conflict bermaydi, lekin deploy ketma-ketligi buziladi. Shuning uchun integratsiya tekshiruvi fayl to‘qnashuvidan kengroq tushunchadir.

Bog‘liq tushunchalar

Git, branch, merge commit, fast-forward, conflict, pull request, common ancestor