- Published on
Git-da Branch-lar orasidagi Merge Conflict-larni hal qilish
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
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:
- Jira tizimi branch-ni avtomatik tanib, ticket bilan bog'lay oladi
- 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
| Tushuncha | Ma'nosi |
|---|---|
| Merge conflict | Ikki versiya o'rtasidagi avtomatik hal qilib bo'lmaydigan ziddiyat |
| Choose Left/Right | Conflict-ni bir tomonni tanlab hal qilish |
| Qisman birlashtirish | Ikkala versiyadan kerakli qismlarni qo'lda birlashtirish |
| Build tekshiruvi | Merge-dan keyin majburiy β conflict yo'qligi kompilyatsiyani kafolatlamaydi |
| Yaxshi arxitektura | Conflict-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.