Merge conflict шийдвэрлэх
Merge хийхэд Git ихэнх тохиолдолд автоматаар нэгтгэдэг. Гэхдээ хоёр branch-ийн нэг файлын яг нэг мөрийг өөр өөрөөр өөрчилсөн бол Git хэнийх нь зөв гэдгийг мэдэхгүй — conflict гарна. Та өөрөө шийдвэрлэх ёстой.
Conflict яагаад үүсдэг вэ?
main: A → B → E
↑ (E-д app/page.tsx-ийн 5-р мөрийг өөрчилсөн)
feature: A → B → C → D
↑ (D-д мөн app/page.tsx-ийн 5-р мөрийг өөрчилсөн)
Хоёр branch нийтлэг B commit-аас хоёр чиглэлд явж, яг нэг газрыг өөрчилсөн. Git "аль нэгийг нь сонго" гэж хэлж чадахгүй тул conflict мэдэгдэнэ.
Conflict гарах үе
git switch main
git merge feature/login
Auto-merging app/page.tsx
CONFLICT (content): Merge conflict in app/page.tsx
Automatic merge failed; fix conflicts and then commit the result.
Git merge хийж дуусаагүй, зогссон. Одоо та хөндлөнгөөс оролцох ёстой.
Ямар файлд conflict байгааг харах:
git status
Both modified: app/page.tsx
<<<, ===, >>> тэмдэгтүүд
Conflict гарсан файлыг нээхэд Git тусгай тэмдэгтүүд нэмсэн байна:
<<<<<<< HEAD
<h1>Тавтай морил</h1>
=======
<h1>Сайн уу, дэлхий!</h1>
>>>>>>> feature/login
| Хэсэг | Утга |
| ------------------------------------------ | --------------------------------------- |
| <<<<<<< HEAD — ======= хүртэл | Таны одоогийн branch-ийн (main) агуулга |
| ======= — >>>>>>> feature/login хүртэл | Merge хийж буй branch-ийн агуулга |
Conflict засах — гараар
Conflict тэмдэгтүүдийг бүгдийг устгаж, зөв агуулгыг үлдээнэ:
Нэгийг нь сонгох:
<h1>Сайн уу, дэлхий!</h1>
Хоёуланг нэгтгэх:
<h1>Тавтай морил — Сайн уу, дэлхий!</h1>
Огт өөр зүйл бичих:
<h1>Монгол хөгжүүлэгчдэд зориулав</h1>
Файлд <<<<<<<, =======, >>>>>>> тэмдэгт нэг ч байхгүй болтол бүгдийг цэвэрлэнэ.
VS Code merge editor
VS Code-д conflict файлыг нээхэд дээд хэсэгт "Resolve in Merge Editor" товч гарна. Дарахад хоёр хувилбар зэрэгцэн харагдах визуал засварлагч нээгдэнэ.
Сонголтууд:
- Accept Current — HEAD (main)-ийн агуулгыг авах
- Accept Incoming — merge хийж буй branch-ийн агуулгыг авах
- Accept Both — хоёуланг нэмэх
- Доод хэсэгт шууд засварлах
Олон файлд conflict байвал VS Code зүүн баруун доод буланд тоолж харуулна.
Conflict шийдсэний дараа commit хийх
Бүх conflict засварласны дараа файлуудыг staging area-д нэмж, commit хийнэ:
git add app/page.tsx
git commit
Git merge commit мессежийг автоматаар бэлдэнэ:
Merge branch 'feature/login'
# Conflicts:
# app/page.tsx
Мессежийг хадгалж editor-с гарахад merge дуусна.
git merge --abort — merge цуцлах
Conflict шийдвэрлэхэд хэцүү санагдвал буцааж болно — merge хийхийн өмнөх байдалд бүрэн буцна:
git merge --abort
Аюулгүй команд — файлуудад хийсэн засвар бүгд арилж, merge хийхийн өмнөх байдал сэргэнэ. Дараа нь дахин оролдож болно.
Conflict багасгах зөвлөмж
Conflict гарахгүй байхын тулд:
- Байнга pull хийх —
main-ийн шинэчлэлтийг байнга татаж авах - Жижиг commit — нэг том commit-ийн оронд олон жижиг commit хийх
- Богино branch — feature branch-ийг удаан нээлттэй байлгахгүй байх
- Харилцах — баг хамт ажиллагсадтайгаа ямар файл засварлаж байгаагаа мэдэгдэх
Дараагийн хичээлд:
git rebase ашиглан commit түүхийг цэвэр, шулуун байлгах аргыг судална.