Published on

Git-da Branch-lar orasidagi Merge Conflict-larni hal qilish

Authors

Bu β€” seriyaning eng murakkab mavzularidan biri: merge conflict (birlashtirish ziddiyati). Bu branch asosiy kod bazasiga birlashtirilayotganda, ikki versiya o'rtasida ziddiyat yuzaga kelganda sodir bo'ladi. Bunday holatda Source Control qaysi o'zgarish to'g'ri ekanini avtomatik bilmaydi β€” bu qaror dasturchi tomonidan qo'lda qabul qilinishi kerak.


Merge conflict qachon yuzaga keladi?

Conflict odatda quyidagi vaziyatda paydo bo'ladi: ikki dasturchi bir xil koddan yangi branch ochadi, ikkalasi ham bir xil qatorni o'zgartiradi, va birinchisi o'z o'zgarishini asosiy branch-ga birlashtirgandan so'ng, ikkinchisi o'z branch-ini birlashtirmoqchi bo'lganda β€” Git ikki versiya o'rtasidagi farqni avtomatik hal qila olmaydi.


Oddiy misol β€” bitta qatordagi conflict

Tasavvur qiling, ikkita dasturchi bir xil ekranni o'zgartirmoqchi:

// Boshlang'ich kod
Image(systemName: "heart.fill")

1-dasturchi o'z branch-ida:

Image(systemName: "house.fill")

2-dasturchi o'z branch-ida (xuddi shu boshlang'ich koddan, lekin alohida):

Image(systemName: "bolt.fill")

1-dasturchi o'z branch-ini avval birlashtiradi β€” muammosiz o'tadi. 2-dasturchi keyin o'z branch-ini birlashtirmoqchi bo'lganda β€” endi asosiy branch-da allaqachon house.fill bor, lekin 2-dasturchi branch-i bu o'zgarishdan bexabar, chunki u eski versiyadan ochilgan edi. Shu sababli Git conflict signali beradi.


Conflict-ni Xcode orqali hal qilish

Merge bosilganda, agar conflict bo'lsa, Xcode maxsus hal qilish ekranini ko'rsatadi. Bu yerda ikki versiya yonma-yon ko'rsatiladi va quyidagi tanlovlar mavjud:

Choose Left   β€” faqat asosiy branch versiyasini olish
Choose Right  β€” faqat yangi branch versiyasini olish
Left then Right β€” ikkalasini ham, avval chap keyin o'ng
Right then Left β€” ikkalasini ham, avval o'ng keyin chap

Misolda faqat bittasi to'g'ri kerak bo'lganda β€” Choose Right (yoki Choose Left) tanlanadi. Ikkalasini ham qo'shish β€” odatda noto'g'ri natijaga olib keladi, chunki ikkala o'zgarish ham bir xil qatorga tegishli.


GitKraken orqali hal qilish

GitKraken-da conflict hal qilish jarayoni yanada vizual: chap va o'ng versiyalar alohida ko'rsatiladi, har birini alohida belgilash mumkin, natija pastda darhol ko'rinadi. Ko'p dasturchilar GitKraken-ning bu ko'rinishini Xcode-nikidan qulayroq deb hisoblaydi.


Conflict hal qilingandan keyin

Barcha conflict-lar hal qilingach, Merge tugmasi bosiladi va branch asosiy kod bazasiga muvaffaqiyatli birlashtiriladi. Shundan so'ng, yangilangan asosiy branch GitHub-ga push qilinishi va endi keraksiz bo'lgan branch-lar o'chirilishi tavsiya etiladi.


Branch nomlash β€” Jira ticket konventsiyasi

Jamoaviy ishlashda, har bir vazifa odatda Jira kabi tizimda ticket sifatida rasmiylashtiriladi (masalan, XYZ-123). Ko'plab jamoalar branch nomiga ticket raqamini qo'shadi:

XYZ-123-update-feature

Bu yondashuvning ikkita afzalligi bor:

  1. Jira tizimi branch-ni avtomatik tanib, ticket bilan bog'lay oladi
  2. Boshqa dasturchilar branch ro'yxatini ko'rganda, qaysi ticket ustida allaqachon ish boshlanganini darhol bilishadi

Murakkabroq conflict β€” qisman birlashtirish

Ba'zan conflict-da ikkala versiyadan ham qism-qism olish kerak bo'ladi β€” to'liq chap yoki to'liq o'ng emas:

// Chap versiya (asosiy branch)
ScrollView {
    VStack {
        ForEach(0..<20) { item in
            Text("Yo")
        }
    }
}

// O'ng versiya (yangi branch)
Text("Yangi sarlavha")
Image(systemName: "globe")
Button("Bosing") { }

Bu holatda ikkala qismni ham saqlash, lekin ularni to'g'ri tartibda birlashtirish kerak bo'lishi mumkin β€” masalan, sarlavha va tugmani saqlab qolib, ForEach ichiga joylashtirish. Bunday murakkab hollarda kodni qo'lda tahrirlash, kerakli qismlarni kesib-joylashtirish to'g'ri yondashuv hisoblanadi.


⚠️ Muhim ogohlantirish β€” conflict hal qilish kompilyatsiyani kafolatlamaydi

Bu β€” ehtiyot bo'lish kerak bo'lgan eng muhim jihatlardan biri: Source Control conflict yo'qligini tasdiqlashi, kodning kompilyatsiya bo'lishini bildirmaydi.

βœ… Conflict hal qilindi β†’ Merge muvaffaqiyatli
❌ Lekin kod hali ham build bo'lmasligi mumkin!

Masalan, qo'lda kod birlashtirilganda, qavslar ({ }) noto'g'ri joyga tushib qolishi yoki butunlay yo'qolib qolishi mumkin β€” chunki Git buni matn darajasida ko'radi, kod sintaksisi darajasida emas. Shuning uchun merge yakunlangandan so'ng, loyihani albatta build qilib tekshirish kerak.

Agar build xato bersa, odatda eng tezkor yo'l β€” merge-ni yakunlab, keyin xatoni alohida tuzatib, qo'shimcha commit bilan saqlash:

1. Merge-ni yakunlash (build bo'lmasa ham)
2. Build xatosini topish (masalan, yetishmayotgan qavs)
3. Xatoni tuzatish
4. "fix merge conflict" kabi commit bilan saqlash
5. Push qilish

Conflict-larni kamaytirish β€” arxitekturaning roli

Ko'p dasturchi bir vaqtning o'zida bitta katta faylda ishlasa, conflict-lar muqarrar va tez-tez sodir bo'ladi β€” bu xuddi bir nechta odam bitta Google Docs hujjatini bir vaqtda tahrirlashga o'xshaydi.

Yechim β€” yaxshi arxitektura: Agar har bir funksiya o'z alohida faylida bo'lsa, turli jamoalar yoki dasturchilar turli fayllar ustida ishlasa, ular bir-birining koduga tegmasdan parallel ishlay oladi. Bu conflict-larning yuzaga kelish ehtimolini sezilarli darajada kamaytiradi.

Katta jamoalarda yaxshi arxitektura β€” shunchaki yaxshi amaliyot emas, balki conflict-larning oldini olishning asosiy vositalaridan biri hisoblanadi. Agar arxitektura yomon bo'lib, hamma narsa bir-biriga bog'liq (coupled) bo'lsa, ikki haftalik ishlab chiqilgan ikkita funksiyani birlashtirishda son-sanoqsiz conflict paydo bo'lishi mumkin β€” bu butun jamoa uchun katta vaqt yo'qotish va bosh og'rig'iga aylanadi.


Branch-larni bir-biriga birlashtirish

Har doim asosiy branch-ga (main) birlashtirish shart emas. Murakkab funksiya ustida ishlaganda, avval funksiya uchun asosiy branch ochib, keyin uning ichida har bir kichik qism uchun alohida sub-branch-lar yaratish va ularni birinchi navbatda funksiya branch-iga birlashtirish β€” keyin esa butun funksiya branch-ini asosiy branch-ga birlashtirish odatiy amaliyot hisoblanadi.


Xulosa

TushunchaMa'nosi
Merge conflictIkki versiya o'rtasidagi avtomatik hal qilib bo'lmaydigan ziddiyat
Choose Left/RightConflict-ni bir tomonni tanlab hal qilish
Qisman birlashtirishIkkala versiyadan kerakli qismlarni qo'lda birlashtirish
Build tekshiruviMerge-dan keyin majburiy β€” conflict yo'qligi kompilyatsiyani kafolatlamaydi
Yaxshi arxitekturaConflict-larning oldini olishning eng samarali usuli

Merge conflict-lar bilan ishlash β€” Git va Source Control-dagi eng qiyin jihatlardan biri va vaqt o'tishi bilan osonlashmaydi, faqat tajriba bilan ko'nikma ortadi. Asosiy maqsad β€” yaxshi arxitektura va to'g'ri branch strategiyasi orqali conflict-larning oldini olish, lekin ular yuzaga kelganda, qaysi o'zgarishni saqlash kerakligini aniq tushunib, qo'lda hal qilishni bilish zarur.

Buy mea coffee