Мэдээ

Merge Conflict-ийн хар дарсан зүүдийг эцэслэв: Git 2.56 албан ёсоор гарлаа

TOGTOKHTOGTOKH·2026 оны есдүгээр сарын 28·2 үзсэн·
Merge Conflict-ийн хар дарсан зүүдийг эцэслэв: Git 2.56 албан ёсоор гарлаа

Хөгжүүлэгч бүрийн өдөр тутмын ажилд тохиолддог хамгийн таагүй мөчүүдийн нэг бол эргэлзээгүй Merge Conflict юм. Хоёр өөр салбар (branch)-ыг нэгтгэх явцад зөрчил үүсэхэд хөгжүүлэгчид кодоо гараар засварлаж, улмаар git add . эсвэл git add -u хийн commit хийдэг. Гэвч энэ үед дутуу арилгасан зөрчлийн тэмдэглэгээ (<<<<<<< HEAD, =======) кодонд үлдэж production руу орох, эсвэл тухайн merge-д огт хамааралгүй бусад локал өөрчлөлтүүд хамт stage хийгдэх эрсдэл байнга гардаг.

Нээлттэй эхийн Git төслийн хамт олон 100 гаруй хувь нэмэр оруулагчийн оролцоотойгоор Git 2.56.0 шинэ хувилбарыг албан ёсоор цацлаа. Энэхүү хувилбар нь олон жилийн турш хөгжүүлэгчдийн толгойн өвчин байсан merge conflict-ийн зохион байгуулалтыг цоо шинэ түвшинд аваачихаас гадна, том хэмжээний репозитор болон монорепод хийгдэх салбар нэгтгэлийг хэдэн арав дахин хурдасгах суурь алгоритмын өөрчлөлтийг багтаажээ.


1. git add --resolved: Зөрчлийн маркер үлдсэн бол хэзээ ч stage хийхгүй

Merge conflict шийдвэрлэх үйл явц хоёр үе шаттай байдаг:

  1. Файлуудаа засварлаж, хүссэн эцсийн кодоо гаргаж авах.
  2. Git-д "Би энэ зөрчлийг шийдчихлээ" гэдгийг мэдэгдэж тухайн файлуудыг stage хийх.

Хуучин арга барилд хөгжүүлэгчид recipe.txt дээрх зөрчлийг засах зуураа notes.txt гэх өөр файлд локал тэмдэглэл хөтөлсөн байлаа гэхэд git add -u нь бүх файлыг хамтад нь stage хийчихдэг байв. Хамгийн ноцтой нь, хэрвээ та 1000 мөр кодын дунд нэг ширхэг >>>>>>> маркер үлдээсэн байсан ч хуучин Git дуугүй л тайван stage хийж, commit болгохыг зөвшөөрдөг байсан билээ.

Git 2.56-аас эхлэн орж ирж буй шинэ тушаал нь:

git add --resolved

Энэхүү шинэ параметр нь зөвхөн index дотор unmerged (нэгтгэгдээгүй, зөрчилтэй) төлөвт байгаа файлуудыг л тусгайлан шүүн шалгадаг. Үүний дараа Git эдгээр файлуудын дотор зөрчлийн маркер үлдсэн эсэхийг урьдчилан scan хийнэ.

Хэрэв та ямар нэг маркерийг орхигдуулсан байвал:

fatal: the following paths still have conflict markers: recipe.txt

гэсэн алдаа зааж, index-ийг огт хөндөхгүйгээр үйлдлийг цуцалдаг. Харин маркер бүрэн цэвэрлэгдсэн бол зөвхөн зөрчилтэй байсан файлууд л stage хийгдэж, таны засварлаж байсан бусад хамааралгүй файлууд (жишээ нь notes.txt) unstaged хэвээр үлдэнэ. Энэ нь санамсаргүй хүний алдааг тэг хүртэл бууруулах асар том хамгаалалт болж байна.


2. Монорепо болон гүн түүхтэй салбаруудад: 70 дахин хурдан merge

Git 2.56-ийн хамгийн том далд инженерийн ялалт бол "Paint-down-to-common" алгоритмын сайжруулалт юм.

Том хэмжээний төслүүд, enterprise монорепо дээр хоёр салбарыг нэгтгэх үед Git нь тэдгээрийн дундын өвөг commit-ийг (merge base) олохын тулд commit граф дээгүүр асар гүн ухралт хийж, коммитуудыг хоёр талын өнгөөр "будаж" хайдаг. Хуучин алгоритм нь олон салаалсан түүхтэй, удаан хугацаанд merge хийгдээгүй байсан салбаруудын түүхийг бүхэлд нь шалгадаг тул граф уншилт асар их хугацаа шаарддаг байв.

GitHub-ийн инженер Elijah Newren болон Git цөмийн багийнхан нэгэн энгийн хэрнээ суут математик шийдлийг нэвтрүүлжээ: Нэг талын дараалалд зөвхөн тухайн талд хамаарах өвөрмөц (exclusive) коммитууд дуусах мөчид шинэ уулзалтын цэг (merge base) цааш нэмж гарч ирэх боломжгүй болдог.

Тиймээс Git нь бүхэл бүтэн түүхийг дуустал гүйх шаардлагагүйгээр алгоритмаа тэр даруй зогсоож чаддаг болсон. Бодит enterprise монорепо дээр туршиж үзэхэд уг граф гүйлтийн хугацаа:

  • 0.68 секундээс 0.01 секунд болж буурчээ.
  • Ихэнх нарийн төвөгтэй салбар нэгтгэлүүд дээр дунджаар 20-оос 70 дахин хурдассан үр дүн гарсан байна.

Энэ сайжруулалт нь ялангуяа CI/CD пайплайн дээр байнга автоматаар rebase, merge шалгадаг системүүдийн серверийн ачааллыг мэдэгдэхүйц хөнгөвчлөх юм.


3. git branch --delete-merged: Нэг мөр Bash скриптүүдийн төгсгөл

Хөгжүүлэгчид өөрсдийн локал салбаруудыг цэвэрлэхийн тулд ихэвчлэн дараах төрлийн урт тушаал ашигладаг байсныг та сайн мэдэх байх:

git branch --merged | grep -v "\*" | xargs -n 1 git branch -d

Энэ нь үйлдлийн систем, бүрхүүл (shell)-ээс хамаарч заримдаа алдаа өгдөг, цээжлэхэд төвөгтэй байв.

Git 2.56-д орж ирсэн өөр нэгэн тухтай шийдэл нь эх салбартай аль хэдийн нэгдсэн бүх локал branch-уудыг нэг тушаалаар, аюулгүй цэвэрлэх суурь боломж юм. Систем нь одоо идэвхтэй байгаа branch болон нэгтгэгдээгүй байгаа ажлуудыг автоматаар хамгаалж, илүүдэл салбаруудыг цэвэрлэх процессыг хялбарчилжээ.


Энэ нь хөгжүүлэгч бидэнд яагаад чухал вэ?

Бид хиймэл оюун, ухаалаг код бичигч агентуудын эрин үед амьдарч байгаа ч бүх кодын суурь дэд бүтэц нь Git дээр тогтдог. AI агентууд өдөрт хэдэн арван Pull Request автоматаар үүсгэж буй өнөө цагт merge conflict үүсэх давтамж урьд өмнөхөөсөө ч их болсон.

git add --resolved зэрэг хамгаалалтын механизм нь хүний болон агентын санамсаргүй хийсэн алдаатай commit-ийг repository руу орохоос хамгаалж өгнө. Харин монорепогийн хурдны сайжруулалт нь баг бүрийн өдөр тутмын хөгжүүлэлтийн урсгалыг гацалтгүй байлгахад бодит дэмжлэг үзүүлэх юм.

Та өөрийн ажиллаж буй үйлдлийн систем дээрээ package manager (brew upgrade git, apt update && apt install git г.м.) ашиглан Git-ээ яг одоо 2.56 хувилбар руу шинэчилж, шинэ боломжуудыг ашиглаж эхлээрэй.


Эх сурвалж: The GitHub Blog, Elijah Newren: Highlights from Git 2.56

Сэтгэгдэл

Ачаалж байна...