Merge Conflict
មាតិកា
- តើ Conflict ជាអ្វី (និងមិនមែនជាអ្វី)
- បង្កើត Conflict មួយដោយចេតនា
- អ្វីដែល Git ប្រាប់អ្នក
- ការអាន Conflict Marker
- ការដោះស្រាយ Conflict
- ការដោះស្រាយនៅក្នុង VS Code
- ប្តូរចិត្តវិញ? git merge --abort
- ធ្វើឲ្យ Conflict នៅតូច
- សាកល្បងដោយខ្លួនឯង
1. តើ Conflict ជាអ្វី (និងមិនមែនជាអ្វី)
នៅក្នុងជំពូកមុន Git បាន merge branch ពីរដោយខ្លួនឯង ព្រោះពួកវាផ្លាស់ប្តូរផ្នែកខុសៗគ្នានៃ project។ Merge conflict កើតឡើងនៅពេលដែល branch ពីរផ្លាស់ប្តូរ បន្ទាត់ដដែលនៃ file ដដែល តាមរបៀបខុសគ្នា។ Git គ្មានវិធីដឹងថាកំណែមួយណាត្រឹមត្រូវទេ — ប្រហែលអ្នកចង់បានមួយនេះ ប្រហែលមួយទៀត ឬប្រហែលលាយទាំងពីរ — ដូច្នេះវាឈប់ ហើយសួរអ្នក។
Conflict មិនមែន ជា៖
- error ឬសញ្ញាថាអ្នកបានធ្វើអ្វីខុសនោះទេ
- repository ដែលខូចនោះទេ
- ការងារដែលបាត់បង់នោះទេ — កំណែទាំងពីរត្រូវបានរក្សាទុកនៅក្បែរគ្នា រហូតដល់អ្នកជ្រើសរើស
Conflict គឺជាផ្នែកធម្មតាមួយនៃការធ្វើការជាមួយអ្នកដទៃ ហើយវាកើតឡើងចំពោះអ្នកអភិវឌ្ឍន៍ដែលមានបទពិសោធន៍រៀងរាល់សប្តាហ៍។ នៅពេលអ្នកបានដោះស្រាយវាពីរបីដង វានឹងលែងគួរឲ្យខ្លាចទៀតហើយ។
2. បង្កើត Conflict មួយដោយចេតនា
វិធីល្អបំផុតដើម្បីរៀនគឺបង្កើតវាផ្ទាល់។ នៅក្នុង my-site ត្រូវប្រាកដថាអ្នកនៅលើ main ហើយ working tree ស្អាត (គ្មានការផ្លាស់ប្តូរដែលមិនទាន់ commit)៖
git switch main
git status
បង្កើត branch មួយដែលផ្លាស់ប្តូរចំណងជើងទំព័រ៖
git switch -c new-title
នៅក្នុង index.html ប្តូរបន្ទាត់ <title> ទៅជា៖
<title>Dara Sok — Personal Site</title>
git commit -am "Use full name in page title"
(-am stage រាល់ file ដែល Git កំពុងតាមដានរួចហើយ ហើយមានការផ្លាស់ប្តូរ និង commit ក្នុងជំហានតែមួយ។ វាមិនរាប់បញ្ចូល file ថ្មីទាំងស្រុងទេ — file ទាំងនោះនៅតែត្រូវការ git add។)
ឥឡូវត្រឡប់ទៅ main វិញ ហើយផ្លាស់ប្តូរ បន្ទាត់ដដែល តាមរបៀបផ្សេង៖
git switch main
<title>Dara's Portfolio</title>
git commit -am "Rename site to portfolio"
Branch ទាំងពីរបានផ្លាស់ប្តូរបន្ទាត់ទី 4 នៃ index.html។ ឥឡូវ merge៖
git merge new-title
3. អ្វីដែល Git ប្រាប់អ្នក
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
Git បាន merge អ្វីៗទាំងអស់ដែលវាអាចធ្វើបាន ហើយឈប់នៅត្រង់ conflict។ ឥឡូវនេះអ្នក កំពុងនៅពាក់កណ្តាលនៃការ merge។ ពិនិត្យមើលថាអ្នកនៅត្រង់ណា៖
git status
On branch main
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: index.html
no changes added to commit (use "git add" and/or "git commit -a")
both modified ប្រាប់ឈ្មោះ file ដែលត្រូវការការសម្រេចចិត្តរបស់អ្នក។ នៅក្នុងការ merge ធំជាងនេះ file ដែល merge បានដោយរលូននឹងត្រូវបង្ហាញដាច់ដោយឡែកនៅក្រោម "Changes to be committed" — មានតែ file ដែលមាន conflict ប៉ុណ្ណោះដែលត្រូវការអ្នក។
4. ការអាន Conflict Marker
បើក index.html។ Git បានសរសេរកំណែទាំងពីរចូលទៅក្នុង file ដោយមាន conflict marker ព័ទ្ធជុំវិញ៖
<head>
<<<<<<< HEAD
<title>Dara's Portfolio</title>
=======
<title>Dara Sok — Personal Site</title>
>>>>>>> new-title
</head>
អានវាជាបីផ្នែក៖
| Marker | អត្ថន័យ |
|---|---|
<<<<<<< HEAD | ចំណុចចាប់ផ្តើមនៃកំណែរបស់ branch បច្ចុប្បន្នរបស់អ្នក (main ដែលអ្នកកំពុងនៅ) |
======= | ខ្សែខណ្ឌចែករវាងកំណែទាំងពីរ |
>>>>>>> new-title | ចំណុចបញ្ចប់នៃកំណែរបស់ branch ដែលកំពុងចូលមក (branch ដែលអ្នកកំពុង merge ចូល) |
អ្វីៗទាំងអស់នៅខាងក្រៅ marker ត្រូវបាន merge យ៉ាងល្អ។ មានតែប្លុកនេះប៉ុណ្ណោះដែលត្រូវការការសម្រេចចិត្ត។
5. ការដោះស្រាយ Conflict
ដើម្បីដោះស្រាយ conflict កែ file នោះឲ្យមើលទៅដូចដែលអ្នកចង់បានពិតប្រាកដ ហើយលុបបន្ទាត់ marker ទាំងបីចោល។ អ្នកមានជម្រើសបី៖
- រក្សា របស់អ្នក៖
Dara's Portfolio - រក្សា របស់គេ៖
Dara Sok — Personal Site - សរសេរ ការលាយបញ្ចូលគ្នា៖ អ្វីមួយថ្មីដែលប្រើទាំងពីរ
តោះបញ្ចូលពួកវាចូលគ្នា។ ជំនួសប្លុកទាំងមូល រួមទាំង marker ដោយ៖
<head>
<title>Dara Sok — Portfolio</title>
</head>
រក្សាទុក file ហើយពិនិត្យម្តងទៀតថាគ្មានបន្ទាត់ <<<<<<<, ======= ឬ >>>>>>> នៅសល់កន្លែងណាមួយក្នុងវាទេ។ បន្ទាប់មកប្រាប់ Git ថា conflict ត្រូវបានដោះស្រាយហើយ ដោយ stage file នោះ ហើយបញ្ចប់ការ merge ដោយ commit មួយ៖
git add index.html
git commit
Editor របស់អ្នកបើកឡើងជាមួយ message Merge branch 'new-title' ដែលសរសេររួចជាស្រេច។ រក្សាទុក រួចបិទ។
git log --oneline --graph -5
* a7f2c19 (HEAD -> main) Merge branch 'new-title'
|\
| * 4d81e0b (new-title) Use full name in page title
* | 9c3b5a6 Rename site to portfolio
|/
* 5a8c3e1 Merge branch 'add-contact'
រួចរាល់។ អ្នកបានដោះស្រាយ merge conflict ដំបូងរបស់អ្នកហើយ។ លុប branch នោះចោលដោយប្រើ git branch -d new-title។
ការដោះស្រាយមិនមែនគ្រាន់តែជារឿង marker ទេ។ Git ពិនិត្យតែបន្ទាត់ដែលប៉ះទង្គិចគ្នាប៉ុណ្ណោះ។ បន្ទាប់ពី conflict ពិតប្រាកដមួយ សូមបើកទំព័រនោះមើល (ឬរត់ app និង test របស់វា) ដើម្បីប្រាកដថាលទ្ធផលដែលបានបញ្ចូលគ្នាដំណើរការបានពិតមែន។
6. ការដោះស្រាយនៅក្នុង VS Code
VS Code ស្គាល់ conflict marker ហើយធ្វើឲ្យការជ្រើសរើសកាន់តែងាយស្រួល។ នៅពេលអ្នកបើក file ដែលមាន conflict នោះ conflict នីមួយៗត្រូវបាន highlight ហើយមានប៊ូតុងតូចៗនៅពីលើវា៖
- Accept Current Change — រក្សាកំណែរបស់ branch អ្នក
- Accept Incoming Change — រក្សាកំណែរបស់ branch មួយទៀត
- Accept Both Changes — រក្សាទាំងពីរ មួយតពីមួយ
- Compare Changes — មើលពួកវានៅក្បែរគ្នា
ការចុចលើប៊ូតុងណាមួយនឹងលុប marker ឲ្យអ្នក។ អ្នកនៅតែអាចកែលទ្ធផលបន្ទាប់ពីនោះបាន។ Panel Source Control របស់ VS Code (រូប icon branch នៅរបារខាងឆ្វេង) ក៏បង្ហាញ file ដែលមាន conflict នៅក្រោម Merge Changes ដែរ។
អ្នកនៅតែបញ្ចប់តាមរបៀបដដែល៖ រក្សាទុក git add git commit។
7. ប្តូរចិត្តវិញ? git merge --abort
ប្រសិនបើអ្នកកំពុងដោះស្រាយបានពាក់កណ្តាល ហើយចង់ចាប់ផ្តើមឡើងវិញ — ឬអ្នកដឹងថាខ្លួន merge ខុស branch — សូមបោះបង់ការ merge ទាំងមូល៖
git merge --abort
Project របស់អ្នកត្រឡប់ទៅដូចពេលមុនអ្នករត់ git merge វិញទាំងស្រុង។ គ្មានអ្វីបាត់បង់ទេ ហើយអ្នកអាចសាកល្បងម្តងទៀតនៅពេលណាដែលអ្នកត្រៀមខ្លួនរួច។
8. ធ្វើឲ្យ Conflict នៅតូច
អ្នកមិនអាចជៀសវាង conflict ទាំងស្រុងបានទេ ប៉ុន្តែអ្នកអាចធ្វើឲ្យវាកើតឡើងកម្រ និងងាយស្រួលដោះស្រាយ៖
- ធ្វើឲ្យ branch មានអាយុខ្លី។ Branch ដែលរស់នៅពីរថ្ងៃ មាន conflict តិចជាង branch ដែលរស់នៅពីរខែច្រើន។
- Merge
mainចូល branch របស់អ្នកឲ្យបានញឹកញាប់ ខណៈពេលដែលអ្នកធ្វើការ ដើម្បីឲ្យអ្នកដោះស្រាយ conflict តូចៗនៅពេលវាកើតឡើង ជំនួសឲ្យ conflict ដ៏ធំមួយនៅចុងបញ្ចប់។ - ធ្វើ commit តូចៗ និងផ្តោតលើរឿងតែមួយ។ ការសម្រេចចិត្តរវាងការផ្លាស់ប្តូរតូចពីរ គឺងាយស្រួលជាងការផ្លាស់ប្តូរធំៗពីរ។
- និយាយជាមួយក្រុមរបស់អ្នក។ ប្រសិនបើមនុស្សពីរនាក់ហៀបនឹងសរសេរ file ដដែលឡើងវិញ ការជជែកគ្នាពីរនាទីអាចសង្គ្រោះអ្នកពីការ merge ដ៏ឈឺក្បាល។
- កុំ reformat file ទាំងមូល នៅក្នុង branch ដដែលជាមួយការផ្លាស់ប្តូរពិតប្រាកដ។ ការប្តូរ indentation នៃគ្រប់បន្ទាត់នឹងបង្កើត conflict ជាមួយមនុស្សគ្រប់គ្នា។
9. សាកល្បងដោយខ្លួនឯង
- បង្កើត និងដោះស្រាយ conflict ខាងលើ ដោយបញ្ចូលចំណងជើងទាំងពីរចូលគ្នា។
- ដោះស្រាយ conflict មួយដោយជ្រើសរើសខាងណាមួយ។ បង្កើត branch ពីរដែលផ្លាស់ប្តូរ
<h1>របស់អ្នកខុសៗគ្នា merge ពួកវាចូលmainមួយតពីមួយ ហើយដោះស្រាយ conflict ដោយប្រើ Accept Incoming Change របស់ VS Code។ - បោះបង់ការ merge។ បង្កើត conflict មួយទៀត មើល marker រួចរត់
git merge --abort។ រត់git statusនិងgit log --onelineដើម្បីពិនិត្យថាគ្មានអ្វីផ្លាស់ប្តូរទេ។ - Conflict នៅពីរកន្លែង។ បង្កើត branch ពីរដែលនីមួយៗផ្លាស់ប្តូរ ទាំង
<title>និង<h1>។ នៅពេលអ្នក merge អ្នកនឹងទទួលបាន conflict ពីរប្លុកនៅក្នុង file តែមួយ។ ដោះស្រាយទាំងពីរមុនពេល commit។
ឥឡូវនេះ អ្នកអាចធ្វើអ្វីៗទាំងអស់ដែល Git ផ្តល់ឲ្យនៅលើកុំព្យូទ័រតែមួយ។ បន្ទាប់ តោះដាក់ my-site នៅលើ GitHub។
ទិញកាហ្វេជូនខ្ញុំ
ចូលចិត្តមេរៀននេះមែនទេ? សូមពិចារណាទិញកាហ្វេជូនខ្ញុំមួយកែវ ដើម្បីគាំទ្រការបង្កើតមាតិកាឥតគិតថ្លៃបន្ថែមទៀត!