Git / Merge conflict шийдвэрлэх

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 гарах үе

bash
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 байгааг харах:

bash
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 тэмдэгтүүдийг бүгдийг устгаж, зөв агуулгыг үлдээнэ:

Нэгийг нь сонгох:

tsx
<h1>Сайн уу, дэлхий!</h1>

Хоёуланг нэгтгэх:

tsx
<h1>Тавтай морил — Сайн уу, дэлхий!</h1>

Огт өөр зүйл бичих:

tsx
<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 хийнэ:

bash
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 хийхийн өмнөх байдалд бүрэн буцна:

bash
git merge --abort

Аюулгүй команд — файлуудад хийсэн засвар бүгд арилж, merge хийхийн өмнөх байдал сэргэнэ. Дараа нь дахин оролдож болно.

Conflict багасгах зөвлөмж

Conflict гарахгүй байхын тулд:

  • Байнга pull хийхmain-ийн шинэчлэлтийг байнга татаж авах
  • Жижиг commit — нэг том commit-ийн оронд олон жижиг commit хийх
  • Богино branch — feature branch-ийг удаан нээлттэй байлгахгүй байх
  • Харилцах — баг хамт ажиллагсадтайгаа ямар файл засварлаж байгаагаа мэдэгдэх

Дараагийн хичээлд:

git rebase ашиглан commit түүхийг цэвэр, шулуун байлгах аргыг судална.