Ачааллж байна...
Өмнөх хичээлд бид add-category салаан дээр ангиллын шүүлтүүр бүтээж, main-ийг хөндөлгүйгээр хоёр ертөнцийн хооронд чөлөөтэй аялсан. Гэхдээ зэрэгцээ ертөнцийн жинхэнэ утга нь тэдгээрийг дахин нэгтгэх боломжид оршино. Туршилт амжилттай болбол түүний үр дүн үндсэн ертөнцөд орох ёстой. Энэ хичээлд бид салаануудыг нэгтгэх git merge command-ыг сурна. Эхлээд ямар ч бэрхшээлгүй, Git бүх ажлыг өөрөө хийдэг хоёр төрлийн нэгтгэлийг харна. Дараа нь хоёр салаа нэг мөрийг өөр өөрөөр өөрчилсөн нөхцөлийг зориуд бий болгож, conflict буюу зөрчилтэй нүүр тулна.
Conflict гэдэг үг олон хөгжүүлэгчийн хувьд айдас төрүүлдэг. Дэлгэцэнд “CONFLICT” гэж том үсгээр гарч, файлд <<<<<<< гэх мэт хачин тэмдэгтүүд гарч ирэхэд ямар нэг зүйл ноцтой эвдэрсэн мэт санагддаг. Энэ хичээлийн зорилго бол тэр айдсыг бүрмөсөн арилгах явдал. Хичээлийн төгсгөлд та conflict бол алдаа биш, Git-ийн танаас асууж буй энгийн асуулт гэдгийг ойлгож, түүнд тайван хариулдаг болно. Бид git-dadlaga фолдер дээрээ, main салаан дээрээс эхэлнэ.
Монголын газрын зураг дээр хоёр гол нийлж нэг урсгал болдог газрууд олон бий, тэдгээрийг бэлчир гэдэг. Хоёр гол өөр өөр уулаас эх авч, өөр өөр хөндийгөөр урсаж ирээд, нэг цэгт нийлж цааш нэг гол болон урсдаг. Хоёуланг нь тэжээж байсан бүх ус шинэ урсгалд орно. Git-ийн merge яг энэ бэлчир юм. Тусдаа урссан хоёр салаа нэг цэгт нийлж, хоёуланд нь хийгдсэн бүх ажлыг агуулсан нэг түүх болж үргэлжилнэ.
Ихэнх бэлчир тайван байдаг: хоёр голын ус бие биедээ саадгүй холилдоно. Git-д ч гэсэн ихэнх merge тайван: нэг салаа нэг файлд, нөгөө нь өөр файлд, эсвэл нэг файлын өөр өөр хэсэгт өөрчлөлт хийсэн бол Git хоёуланг нь автоматаар нэгтгэнэ. Харин заримдаа хоёр гол яг нэг цэгт өөр өөр чиглэлд түлхэж зөрөлддөг. Git-д энэ нь хоёр салаа яг нэг мөрийг өөр өөрөөр өөрчилсөн үед тохиолддог. Тэр үед Git аль голын урсгал зөв болохыг өөрөө шийдэхгүй, учир нь тэр таны кодын утгыг ойлгодоггүй. Тиймээс Git зогсоод "энд хоёр өөр хувилбар байна, аль нь зөв бэ?" гэж танаас асууна. Энэ асуулт бол conflict юм.
Алхам 1: Эхлэх байдлаа шалгах
VS Code-д git-dadlaga фолдероо нээж, terminal-д бичнэ үү.
Command:
git status
git log --oneline --all -4Гаралт:
On branch main
nothing to commit, working tree clean
3c9a6d2 (add-category) Point to category filter in main script
7b2e1f8 Add category filter
9e3b5a1 (HEAD -> main) Add average expense
5d8c3e7 Add .gitignore and example env filemain дээр, ажлын фолдер цэвэр. add-category салаа main-аас хоёр commit урагшилсан. Өмнөх хичээлээс хойш main огт хөдлөөгүй гэдгийг анзаараарай. Энэ нь удахгүй чухал болно.
Алхам 2: Нэгтгэх
Merge-ийн хамгийн чухал дүрмийг эхлээд санацгаая: merge нь нэрлэсэн салааг таны одоо байгаа салаа руу авчирдаг. Тиймээс add-category-ийн ажлыг main-д оруулахын тулд бид main дээр байх ёстой, тэгээд add-category-г нэрлэнэ. Энэ нь гэрийн эзэн зочноо урьж оруулахтай адил: та өөрийн гэрт байж, хэнийг оруулахаа нэрлэдэг.
Command:
git merge add-categoryГаралт:
Updating 9e3b5a1..3c9a6d2
Fast-forward
angilal.py | 10 ++++++++++
zarlaga.py | 1 +
2 files changed, 11 insertions(+)
create mode 100644 angilal.pyМөр мөрөөр уншъя. “Updating 9e3b5a1..3c9a6d2” нь “9e3b5a1-ээс 3c9a6d2 хүртэл шинэчилж байна” гэсэн утгатай. Хоёр цэг “..” нь “-аас ... хүртэл” гэсэн утгатай. “Fast-forward” нь энэ merge-ийн төрөл бөгөөд доор тусад нь тайлбарлана. Дараагийн хоёр мөр файл бүрийн хураангуй: angilal.py-д 10 мөр нэмэгдсэн, zarlaga.py-д 1 мөр нэмэгдсэн. “+” тэмдгүүдийн тоо нь өөрчлөлтийн хэмжээг харуулдаг жижиг диаграм юм. Дараа нь нийт дүн, эцэст нь angilal.py шинэ файл гэдгийг харуулна. Explorer хэсгийг хараарай: main салаан дээр angilal.py гарч ирсэн, zarlaga.py-ийн дээд мөрөнд тайлбар бий. Шүүлтүүрийн ажил main-д орлоо.
Fast-forward гэж юу вэ
Энэ нэгтгэлийн үед Git ямар ч шинэ commit үүсгээгүй. Учир нь add-category салаалсны дараа main огт урагшлаагүй байсан. Голын зүйрлэлээр бол нэг гол урсгалаа үргэлжлүүлж байхад нөгөө нь газар дээрээ зогсож байсан. Ийм үед нийлэх зүйл байхгүй, main зүгээр л add-category-ийн замаар урагшилж, түүнийг гүйцэх хэрэгтэй. “Fast-forward” нь "хурдан урагшлуулах" гэсэн утгатай бөгөөд Git main хавчуургыг 9e3b5a1-ээс 3c9a6d2 руу шилжүүлсэн, тэгээд л болоо.
Command:
git log --oneline -3Гаралт:
3c9a6d2 (HEAD -> main, add-category) Point to category filter in main script
7b2e1f8 Add category filter
9e3b5a1 Add average expenseОдоо main ба add-category хоёр хавчуурга нэг зураг дээр байна. Түүх нэг шулуун шугам хэвээрээ, яг л салаа хэзээ ч байгаагүй мэт. Энэ бол хамгийн цэвэр, хамгийн түгээмэл нэгтгэл юм.
Одоо хоёр салаа хоёулаа урагшилсан, өөрөөр хэлбэл хоёр гол хоёулаа урссан нөхцөлийг харъя. Цалингийн файлыг сайжруулах шинэ салаа үүсгэнэ.
Command:
git switch -c improve-salaryГаралт:
Switched to a new branch 'improve-salary'VS Code-д tsalin.py-г нээж, доор нь мөр нэмж хадгална уу.
python
print("Цалингийн тооцоо удахгүй нэмэгдэнэ")Command:
git add tsalin.py
git commit -m "Add salary placeholder message"Гаралт:
[improve-salary e8f4a21] Add salary placeholder message
1 file changed, 1 insertion(+)Одоо main руу буцаж, тэнд өөр файл дээр ажиллая. Энэ нь бодит амьдралд их тохиолддог: та нэг салаан дээр ажиллаж байхад main дээр өөр зүйл өөрчлөгддөг.
Command:
git switch mainГаралт:
Switched to branch 'main'VS Code-д data/notes.txt-г нээж, доор нь “Category filter merged” гэсэн мөр нэмж хадгална уу.
Command:
git add data/notes.txt
git commit -m "Update notes after category merge"Гаралт:
[main 6b0d3f5] Update notes after category merge
1 file changed, 1 insertion(+)Одоо хоёр гол хоёулаа урагшилсан. main шинэ 6b0d3f5 commit-тэй, improve-salary шинэ e8f4a21 commit-тэй. Хоёулаа 3c9a6d2-оос салаалсан ч тус бүр өөрийн замаар явсан. Энэ удаад fast-forward боломжгүй, учир нь main improve-salary-ийн замд биш, өөр замд урагшилсан. Нэгтгэе.
Command:
git merge --no-edit improve-salaryГаралт:
Merge made by the 'ort' strategy.
tsalin.py | 1 +
1 file changed, 1 insertion(+)“--no-edit” хэсгийг 2.5 дугаар хичээлийн amend-ээс таньж байгаа: “message-ийг editor-т засварлахгүй, бэлэн message-ийг ашигла” гэсэн утгатай. Энэ удаад Git шинэ commit үүсгэх тул түүнд message хэрэгтэй, Git өөрөө “Merge branch ‘improve-salary’” гэсэн message бэлдсэн. Хэрвээ “--no-edit”-ийг бичихгүй бол VS Code-д MERGE_MSG нэртэй таб нээгдэж, яг тэр бэлэн message-тэй гарч ирнэ. Тэгвэл табыг зүгээр хаахад л хангалттай.
Гаралтын эхний мөр “Merge made by the ‘ort’ strategy” нь “merge-ийг ‘ort’ аргаар хийлээ” гэсэн утгатай. ort бол Git-ийн нэгтгэлийн аргын нэр бөгөөд танд хамаагүй техникийн мэдээлэл. Чухал нь “Merge made” буюу “merge хийгдлээ” гэсэн хэсэг. Доор нь improve-salary-аас ирсэн өөрчлөлтийн хураангуй байна: tsalin.py-д нэг мөр. VS Code-д tsalin.py-г харвал шинэ мөр бий, data/notes.txt-д main-ийн нэмсэн мөр ч хэвээрээ. Хоёр голын ус хоёулаа шинэ урсгалд орсон.
Command:
git log --oneline --graph -5Гаралт:
* b5e9c71 (HEAD -> main) Merge branch 'improve-salary'
|\
| * e8f4a21 (improve-salary) Add salary placeholder message
* | 6b0d3f5 Update notes after category merge
|/
* 3c9a6d2 (add-category) Point to category filter in main script“--graph” нэмэлт нь Git-ийг түүхийг тэмдэгтээр зурахыг хүсдэг. Доороос дээш уншъя. Хамгийн доорх 3c9a6d2 бол хоёр голын эх, нийтлэг цэг. Түүнээс дээш “|/” тэмдэг зам хоёр салаалсныг харуулна. Зүүн талын шугам дээр main-ийн 6b0d3f5, баруун талын шугам дээр improve-salary-ийн e8f4a21 тус тусдаа байна. “|\” тэмдэг хоёр зам дахин нийлж буйг заана. Хамгийн дээрх b5e9c71 бол merge commit, хоёр голын бэлчир юм. Энэ commit онцгой: ердийн commit нэг эцэгтэй бол merge commit хоёр эцэгтэй, учир нь тэр хоёр түүхийг холбож байна.
Алхам 1: Зөрчлийг зориуд бий болгох
Одоо хоёр салаа яг нэг мөрийг өөр өөрөөр өөрчлөх нөхцөлийг бий болгоё. Зарлагын нийлбэрийн мөрөнд мөнгөн тэмдэгт нэмэх санаа хоёр газар зэрэг төржээ гэж төсөөлөөрэй. Эхлээд шинэ салаа үүсгэнэ.
Command:
git switch -c change-currencyГаралт:
Switched to a new branch 'change-currency'VS Code-д zarlaga.py-г нээгээд "Нийт зарлага" гэсэн мөрийг дараах байдлаар өөрчилж хадгална уу.
python
print("Нийт зарлага:", sum(zarlaga), "төгрөг")Command:
git add zarlaga.py
git commit -m "Show currency in total"Гаралт:
[change-currency 1f6c3a9] Show currency in total
1 file changed, 1 insertion(+), 1 deletion(-)Одоо main руу буцаж, яг ижил мөрийг өөр аргаар өөрчилнө.
Command:
git switch mainГаралт:
Switched to branch 'main'VS Code-д zarlaga.py-г харахад "Нийт зарлага" мөр анхны хэлбэрээрээ байгаа, учир нь change-currency-ийн өөрчлөлт өөр салаанд байна. Тэр мөрийг энэ удаад дараах байдлаар өөрчилж хадгална уу.
python
print("Нийт зарлага (₮):", sum(zarlaga))Command:
git add zarlaga.py
git commit -m "Add currency symbol to total label"Гаралт:
[main 8a2d5e4] Add currency symbol to total label
1 file changed, 1 insertion(+), 1 deletion(-)Одоо хоёр гол яг нэг цэгт өөр чиглэл рүү урсаж байна. main "Нийт зарлага (₮):" гэж хүсэж байхад change-currency "төгрөг" гэдэг үгийг төгсгөлд нь нэмэхийг хүсэж байна. Аль нь зөв бэ? Git үүнийг мэдэхгүй, учир нь хоёулаа зөв код юм.
Алхам 2: Conflict-тэй нүүр тулах
Command:
git merge change-currencyГаралт:
Auto-merging zarlaga.py
CONFLICT (content): Merge conflict in zarlaga.py
Automatic merge failed; fix conflicts and then commit the result.Амьсгаагаа нэг аваад, энэ гурван мөрийг тайван уншъя. “Auto-merging zarlaga.py” нь “zarlaga.py-г автоматаар нэгтгэж байна” гэсэн утгатай: Git оролдлого хийсэн. “CONFLICT (content): Merge conflict in zarlaga.py” нь "агуулгын зөрчил: zarlaga.py-д merge-ийн зөрчил байна" гэсэн утгатай. “content” гэдэг үг асуудал файлын агуулгад, өөрөөр хэлбэл кодын мөрүүдэд байгааг заана. Гурав дахь мөр “Automatic merge failed; fix conflicts and then commit the result” нь "автомат нэгтгэл бүтэлгүйтлээ; зөрчлийг засаад үр дүнг commit хий" гэсэн утгатай.
Энэ мессежид “failed” гэсэн үг бий ч юу ч эвдрээгүй, юу ч устаагүй. Git зөвхөн "би энэ ганц газрыг өөрөө шийдэж чадахгүй, тусламж хэрэгтэй" гэж хэлж байна. Тэр бүх ажлаа зогсоогоод, яг аль газар шийдвэр хэрэгтэйг тэмдэглэж, таныг хүлээж байна. Бусад бүх зүйл аль хэдийн нэгтгэгдсэн. Хамгийн чухал нь: хэрвээ та одоо сандарч, юу ч хийхийг хүсэхгүй байвал git merge --abort гэж бичихэд бүх зүйл merge-ээс өмнөх байдалдаа яг буцна. Энэ гарц үргэлж нээлттэй тул та яаралгүй, тайван ажиллаж болно.
Алхам 3: Нөхцөл байдлыг унших
Command:
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: zarlaga.py
no changes added to commit (use "git add" and/or "git commit -a")Гурван асуултаараа уншъя. Аль branch дээр байна? main. Ямар файлд асуудал байна? “Unmerged paths” буюу "нэгтгэгдээгүй замууд" хэсэгт “both modified: zarlaga.py” гэж бичигдсэн нь "хоёулаа өөрчилсөн: zarlaga.py" гэсэн утгатай, хоёр салаа хоёулаа энэ файлыг өөрчилсөн. Git юу хийхийг зөвлөж байна? Хаалтан доторх зааврууд яг алхам алхмаар зааж байна: эхлээд зөрчлийг засаад “git commit” ажиллуул, хэрвээ болихыг хүсвэл “git merge --abort” ашигла, засаж дууссан файлаа “git add”-ээр шийдэгдсэн гэж тэмдэглэ. Энэ гаралт бол таны conflict шийдвэрлэх бүрэн заавар юм.
Алхам 4: Conflict тэмдэглэгээг унших
VS Code-д zarlaga.py-г нээнэ үү. Файл дараах байдалтай болсон байна.
# Ангиллаар шүүх боломжийг angilal.py файлаас харна уу
zarlaga = [5000, 12000, 3500, 8000]
<<<<<<< HEAD
print("Нийт зарлага (₮):", sum(zarlaga))
=======
print("Нийт зарлага:", sum(zarlaga), "төгрөг")
>>>>>>> change-currency
print("Зарлагын тоо:", len(zarlaga))
print("Хамгийн их зарлага:", max(zarlaga))
print("Дундаж зарлага:", sum(zarlaga) / len(zarlaga))Энэ бол энэ хичээлийн гол зорилго тул файлыг мөр мөрөөр нь уншъя. Эхний хоёр мөр болон сүүлийн гурван мөр хэвийн байна: тэдгээрт ямар ч зөрчил байгаагүй тул Git тэднийг хөндөлгүй үлдээжээ. Асуудал зөвхөн дунд хэсэгт, гурван тэмдэглэгээний хооронд байна.
“<<<<<<< HEAD” мөр зөрчилтэй хэсгийн эхлэлийг заана. Долоон “<” тэмдгийн ард HEAD гэж бичигдсэн нь "одоо байгаа салааны, өөрөөр хэлбэл таны main-ийн хувилбар эндээс эхэлнэ" гэсэн утгатай. Түүний доорх “print("Нийт зарлага (₮):", sum(zarlaga))” мөр бол main-ийн хувилбар.
“=======” мөр бол хоёр хувилбарын хоорондох хил. Долоон тэнцүүгийн тэмдэг "дээрх нь нэг тал, доорх нь нөгөө тал" гэдгийг заана.
Түүний доорх “print("Нийт зарлага:", sum(zarlaga), "төгрөг")” мөр бол change-currency салааны хувилбар.
“>>>>>>> change-currency” мөр зөрчилтэй хэсгийн төгсгөлийг заана. Долоон “>” тэмдгийн ард нэгтгэж буй салааны нэр бичигдсэн: “change-currency салааны хувилбар энд дуусна”.
Өөрөөр хэлбэл Git бидэнд маш тодорхой зүйл хэлж байна: "Энэ мөрийн хувьд хоёр хувилбар байна. Дээд талынх нь таных, доод талынх нь нэгтгэж буй салааных. Аль нэгийг нь сонго, эсвэл хоёуланг нь нэгтгэсэн шинэ хувилбар бич. Дараа нь миний тэмдэглэгээнүүдийг устга." Энэ гурван тэмдэглэгээ бол Python код биш, Git-ийн түр тэмдэглэл. Тэдгээр файлд үлдвэл Python кодыг ажиллуулахгүй.
Алхам 5: Шийдвэр гаргах
Одоо та программын эзний хувьд шийдвэр гаргана. Энэ бол Git-ийн хийж чадахгүй, зөвхөн хүний хийж чадах ажил. Танд гурван сонголт бий. Нэгдүгээрт, main-ийн хувилбарыг үлдээх. Хоёрдугаарт, change-currency-ийн хувилбарыг үлдээх. Гуравдугаарт, хоёр санааг нэгтгэсэн шинэ мөр бичих. Бид "төгрөг" гэдэг үг ₮ тэмдгээс илүү ойлгомжтой гэж үзээд change-currency-ийн хувилбарыг сонгоё.
VS Code-д тэмдэглэгээнүүд бүхий таван мөрийг бүхэлд нь устгаад, оронд нь сонгосон ганц мөрийг үлдээнэ үү. Файл дараах байдалтай болох ёстой.
python
# Ангиллаар шүүх боломжийг angilal.py файлаас харна уу
zarlaga = [5000, 12000, 3500, 8000]
print("Нийт зарлага:", sum(zarlaga), "төгрөг")
print("Зарлагын тоо:", len(zarlaga))
print("Хамгийн их зарлага:", max(zarlaga))
print("Дундаж зарлага:", sum(zarlaga) / len(zarlaga))<<<<<<<, =======, >>>>>>> тэмдэглэгээнүүдийн нэг нь ч үлдээгүй эсэхийг нүдээрээ шалгаад хадгална уу. Дараа нь кодоо ажиллуулж, зөв ажиллаж байгааг баталгаажуулна. Энэ бол conflict шийдвэрлэх хамгийн чухал алхмуудын нэг, учир нь хоёр санааг нэгтгэх үед код эвдрэх нь элбэг.
Command:
python zarlaga.pyГаралт:
Нийт зарлага: 28500 төгрөг
Зарлагын тоо: 4
Хамгийн их зарлага: 12000
Дундаж зарлага: 7125.0Программ ажиллаж байна.
VS Code-ийн туслах товчнууд
VS Code conflict-ийг таньж, тэмдэглэгээний дээр жижиг товчнууд харуулдаг: “Accept Current Change”, “Accept Incoming Change”, “Accept Both Changes”, “Compare Changes”. “Current” нь HEAD буюу таны салааны хувилбар, “Incoming” нь нэгтгэж буй салааных, “Both” нь хоёуланг нь дараалан үлдээнэ. Мөн хоёр хувилбарыг өнгөөр ялгаж, HEAD хэсгийг ногоон, ирж буй хэсгийг цэнхэр болгодог. Эдгээр товчнууд тохиромжтой бөгөөд хожим та тэдгээрийг байнга ашиглах болно. Гэхдээ эхний удаад гараар засах нь чухал: тэмдэглэгээ бүрийг өөрийн гараар устгаснаар файлд яг юу болж байгааг бүрэн ойлгодог.
Алхам 6: Шийдвэрээ Git-д мэдэгдэх
Файл засагдсан ч Git үүнийг хараахан мэдэхгүй. git status-ийн зааврыг санацгаая: "засаж дууссан файлаа git add-ээр шийдэгдсэн гэж тэмдэглэ".
Command:
git add zarlaga.py
git statusГаралт:
On branch main
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)
Changes to be committed:
modified: zarlaga.py“All conflicts fixed but you are still merging” нь "бүх зөрчил засагдсан, гэхдээ та merge хийж байгаа хэвээр байна" гэсэн утгатай. Хаалтан доторх заавар “merge-ийг дуусгахын тулд git commit ашигла” гэж байна. Энэ үед git add нь өөр утгатай болсныг анзаараарай: ердийн үед "ачааны талбай руу зөөх", харин conflict-ийн үед "энэ файлын зөрчлийг шийдсэн" гэсэн баталгаа.
Command:
git commit --no-editГаралт:
[main 4d7e2b8] Merge branch 'change-currency'Merge дууслаа. Git-ийн бэлдсэн “Merge branch ‘change-currency’” message-тэй merge commit үүслээ. Түүхийг харъя.
Command:
git log --oneline --graph -4Гаралт:
* 4d7e2b8 (HEAD -> main) Merge branch 'change-currency'
|\
| * 1f6c3a9 (change-currency) Show currency in total
* | 8a2d5e4 Add currency symbol to total label
|/
* b5e9c71 Merge branch 'improve-salary'Хоёр гол дахин нэг урсгал болж нийлсэн. Таны шийдвэр 4d7e2b8 merge commit-д бүрмөсөн хадгалагдсан. Хожим хэн нэгэн "энэ мөр яагаад ийм болсон бэ" гэж асуувал түүх энэ бэлчирийг, хоёр хувилбарыг, таны сонголтыг бүгдийг нь харуулна.
Алхам 7: Нэгтгэсэн салаануудыг цэвэрлэх
Гурван салааны ажил одоо бүгд main-д байна. Тэдгээрийн хавчуурга цаашид хэрэггүй.
Command:
git branch -d add-category improve-salary change-currencyГаралт:
Deleted branch add-category (was 3c9a6d2).
Deleted branch improve-salary (was e8f4a21).
Deleted branch change-currency (was 1f6c3a9).Энэ удаад Git “not fully merged” гэж эсэргүүцсэнгүй, учир нь гурван салааны бүх commit main-д орсон. Хавчуурга устсан, зургууд main-ийн түүхэд үүрд үлдэнэ. Нэгтгэсэн салааг устгах нь хавчуургын тавиураа цэвэр байлгах сайн дадал юм.
Энэ хичээлийг дуусгахаас өмнө conflict-ийн тухай гурван зүйлийг тодорхой хэлье. Нэгдүгээрт, conflict бол алдаа биш, асуулт. Git таны кодыг эвдээгүй, харин хоёр зөв хувилбарын аль нь танд хэрэгтэйг асууж байна. Мэргэжлийн хөгжүүлэгчид conflict-ийг долоо хоног бүр шийддэг бөгөөд энэ бол ажлын ердийн хэсэг. Хоёрдугаарт, conflict-ийн үед юу ч алдагддаггүй. Хоёр салааны бүх commit цомогт хэвээр бөгөөд хэрвээ шийдвэрээ буруу гаргасан бол хуучин хувилбарууд түүхэнд байсаар байна. Гуравдугаарт, гарц үргэлж нээлттэй: git merge --abort бүх зүйлийг merge-ээс өмнөх байдалд буцаана. Энэ гурван үнэнийг санасан хүн conflict-ээс айхаа больдог.
Мөн conflict-ийг багасгах энгийн дадал бий: салааг удаан хугацаагаар тусад нь бүү байлга. Салаа хэдий чинээ удаан, хэдий чинээ их өөрчлөлттэйгээр main-аас тусдаа амьдарна, тэдгээрийн хооронд зөрчил үүсэх магадлал төдий чинээ өсдөг. Жижиг ажил бүрт салаа үүсгэж, дуусмагц нь удалгүй нэгтгэх нь хамгийн тайван арга юм.
Хүсвэл шинэ conflict-ийг өөрөө бий болгож, энэ удаад гурав дахь сонголтыг, хоёр санааг нэгтгэсэн шинэ мөрийг туршаад үзээрэй. Жишээ нь хоёр салаанд "Зарлагын тоо" мөрийг өөр өөрөөр өөрчлөөд нэгтгэвэл conflict гарна. Тэмдэглэгээнүүдийг устгахдаа хоёр хувилбарын аль нэгийг биш, хоёулангийнх нь сайн талыг агуулсан мөр бичээрэй. Энэ удаад VS Code-ийн “Accept Both Changes” товчийг дарж юу болохыг ч харж болно: хоёр мөр хоёулаа үлдэх бөгөөд тэдгээрийн аль нэгийг гараар засах хэрэгтэй болно.
Ажлын фолдер цэвэр бус үед merge хийх.
error: Your local changes to the following files would be overwritten by merge:
zarlaga.py
Please commit your changes or stash them before you merge.
AbortingЭнэ мессежийг өмнөх хичээлийн салаа солихоос таньж байгаа: “checkout”-ийн оронд “merge” гэсэн үг л өөр. Merge таны commit хийгээгүй өөрчлөлтийг дарах эрсдэлтэй тул Git эхлэхээсээ өмнө зогсоосон. Өөрчлөлтөө commit хийх эсвэл git restore-оор хаяад merge-ээ дахин оролдоно уу. Өмнөх хичээлийн дүрэм энд ч хүчинтэй: merge хийхийн өмнө git status “working tree clean” гэж хэлж байх ёстой.
Тэмдэглэгээ үлдээгээд commit хийх. Хэрвээ та нэг тэмдэглэгээг устгахаа мартаад git add хийвэл Git анхааруулахгүй, файлыг шийдэгдсэн гэж хүлээж авна. Харин Python кодыг ажиллуулахад дараах алдаа гарна.
File "C:\Users\Bat\git-dadlaga\zarlaga.py", line 3
<<<<<<< HEAD
^^
SyntaxError: invalid syntaxPython гурав дахь мөрөнд “<<<<<<< HEAD”-ийг олоод түүнийг код гэж уншиж чадсангүй. Үүнээс сэргийлэхийн тулд conflict шийдсэний дараа, git add-ийн өмнө кодоо заавал ажиллуулаарай. Мөн олон файлтай үед дараах command үлдсэн тэмдэглэгээг хайж олно.
Select-String -Path *.py -Pattern "<<<<<<<"Хэрвээ энэ command юу ч хэвлэхгүй бол .py файлуудад тэмдэглэгээ үлдээгүй байна. Хэрвээ мөр хэвлэвэл тэр файл, тэр мөрийн дугаарыг заана.
Буруу чиглэлд merge хийх. Merge нэрлэсэн салааг одоогийн салаа руу авчирдаг. Хэрвээ та change-currency дээр байхдаа git merge main гэж бичвэл main-ийн ажил change-currency руу орно, эсрэгээрээ биш. Энэ нь заримдаа санаатайгаар хийгддэг ч ихэнхдээ төөрөгдөл юм. Merge хийхийн өмнө VS Code-ийн зүүн доод буланд эсвэл git status-ийн эхний мөрөнд одоо аль салаан дээр байгаагаа шалгаарай. Үндсэн дүрэм: ажлаа main руу оруулахын тулд эхлээд main руу шилжинэ.
Аль хэдийн нэгтгэсэн салааг дахин нэгтгэх.
Already up to date."Аль хэдийн шинэчлэгдсэн" гэсэн утгатай. Тэр салааны бүх ажил одоогийн салаанд аль хэдийн байгаа тул нэгтгэх зүйл алга. Энэ бол алдаа биш, юу ч өөрчлөгдсөнгүй.
Сандрах. Хэрвээ conflict-ийн дунд юу болж байгааг ойлгохоо больж, файлуудыг хэтэрхий их өөрчилсөн мэт санагдвал хамгийн сайн алхам бол зогсож, git merge --abort бичих явдал юм. Гаралт ихэнхдээ хоосон байх бөгөөд git status merge-ээс өмнөх цэвэр байдлыг харуулна. Дараа нь амьсгаагаа аваад, энэ хичээлийн алхмуудыг дахин эхнээс нь дагаж болно. Энэ command-ыг ашиглах нь сул дорой байдлын шинж биш, ухаалаг шийдвэр юм.
git merge нэр нэрлэсэн салааг одоогийн салаа руу нэгтгэдэг тул ажлыг main-д оруулахын тулд эхлээд main дээр байх ёстой. Хэрвээ main салаалснаас хойш хөдлөөгүй бол fast-forward болж, main хавчуурга шинэ commit үүсгэлгүйгээр урагшилна. Хэрвээ хоёр салаа хоёулаа урагшилсан бол Git хоёр эцэгтэй merge commit үүсгэнэ. “--no-edit” нь Git-ийн бэлдсэн message-ийг ашиглана. Хоёр салаа нэг мөрийг өөр өөрөөр өөрчилсөн бол conflict гарна: Git зогсоод, файлд <<<<<<< HEAD (таны хувилбар), ======= (хил), >>>>>>> салааны-нэр (ирж буй хувилбар) гэсэн тэмдэглэгээ тавина. Шийдвэрлэхдээ эцсийн хувилбараа бичиж, бүх тэмдэглэгээг устгаж, кодоо ажиллуулж шалгаад, git add-ээр шийдэгдсэн гэж тэмдэглэж, git commit-оор merge-ийг дуусгана. git merge --abort бүх зүйлийг merge-ээс өмнөх байдалд буцаадаг. Conflict бол алдаа биш, асуулт бөгөөд түүний үед юу ч алдагддаггүй. Нэгтгэсэн салаануудыг git branch -d-ээр цэвэрлэнэ.
Дараагийн хичээл бол Түвшин 1-ийн удирдлагатай бүтээл. Бид дадлагын фолдероос гарч, өмнөх сургалтын жинхэнэ зарлагын бүртгэлийн төслөө Git-д оруулна: repository үүсгэх, .gitignore бичих, анхны commit, шинэ боломжид зориулсан салаа, түүнийг нэгтгэх. Түвшин 1-д сурсан бүх зүйл нэг бодит төсөл дээр нэгдэх болно.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.