สรุปไฮไลท์ Git 2.56 ฟีเจอร์ใหม่เพียบ พร้อมแก้บั๊กประสิทธิภาพ

โปรเจกต์โอเพนซอร์ส Git ได้ประกาศเปิดตัวเวอร์ชัน 2.56.0 อย่างเป็นทางการ โดยรวบรวมฟีเจอร์ใหม่และการแก้ไขบั๊กจากผู้ร่วมพัฒนาถึง 104 ราย ซึ่งในจำนวนนี้มีนักพัฒนาหน้าใหม่ถึง 39 ราย หลังจากที่เราได้ติดตามความเคลื่อนไหวครั้งล่าสุดไปเมื่อครั้ง ตอนที่ 2.55 ถูกปล่อยออกมา เพื่อเป็นการฉลองการอัปเดตครั้งนี้ GitHub ได้สรุปฟีเจอร์และการเปลี่ยนแปลงที่น่าสนใจที่สุดบางส่วนมาให้ผู้ใช้งานได้ศึกษากัน
Stage ข้อขัดแย้ง (conflicts) ที่แก้ไขแล้วโดยไม่ต้อง stage ทั้งหมด
การแก้ไข merge conflict ปกติจะมีสองขั้นตอน คือการแก้ไฟล์ใน working tree ให้เรียบร้อย และการสั่ง stage เพื่อบอก Git ว่าจัดการเสร็จแล้ว แต่คำสั่งเดิมอย่าง git add -u มักจะเผลอ stage ไฟล์อื่นที่ไม่เกี่ยวข้องติดไปด้วย หรือบางครั้งอาจเผลอ stage ไฟล์ที่ยังมี conflict markers หลงเหลืออยู่
Git 2.56 จึงนำเสนอเวิร์กโฟลว์ที่ปลอดภัยกว่าด้วยคำสั่งใหม่:
$ git add --resolved
fatal: the following paths still have conflict markers:
recipe.txt
$ # Edit recipe.txt and remove the conflict markers.
$ git add --resolved
$ git status --short
M notes.txt
M recipe.txtโหมด git add --resolved ถูกออกแบบมาเพื่อขั้นตอนนี้โดยเฉพาะ โดยจะตรวจสอบเฉพาะไฟล์ที่ยังไม่ถูกรวม (unmerged) และสแกนหา conflict markers ก่อนจะยอมให้ stage ไฟล์ หากพบสิ่งที่ผิดปกติ Git จะแจ้งเตือนและไม่เปลี่ยนแปลง index ใดๆ ทำให้เหมาะมากสำหรับผู้ดูแลระบบที่ต้องจัดการการ merge ในขณะที่มีงานอื่นค้างอยู่ในเครื่อง
[source, discussion]
เพิ่มความเร็วการค้นหาประวัติด้วยการหยุดค้นหาเมื่อไม่มี merge bases
การทำงานหลายอย่างใน Git ต้องค้นหาบรรพบุรุษร่วมที่ใกล้ที่สุด (best common ancestor) ของสอง commit เพื่อใช้เป็นจุดเริ่มต้นในการรวมงาน เดิมที Git จะต้องค้นหาไปเรื่อยๆ จนกว่าจะมั่นใจว่าพบครบทั้งหมด ซึ่งในประวัติศาสตร์ที่มีความซับซ้อนอย่าง Criss-cross merges อาจทำให้ Git เสียเวลาประมวลผลประวัติเก่าๆ นานเกินความจำเป็น
ในเวอร์ชัน 2.56 Git ได้ปรับปรุงอัลกอริทึมใหม่ให้ติดตามจำนวน commit ในคิวแยกตามฝ่าย เมื่อฝ่ายใดฝ่ายหนึ่งหมดไป Git จะสามารถหยุดการค้นหาได้ทันทีเพราะรู้ว่าจะไม่มีจุดนัดพบใหม่เกิดขึ้นอีกแล้ว

ผลลัพธ์จากการปรับปรุงนี้เห็นได้ชัดใน monorepo ขนาดใหญ่ โดยการค้นหาบางกรณีเร็วขึ้นถึง 70 เท่า และค่าเฉลี่ยดีขึ้นประมาณ 20 เท่า ตัวอย่างเช่นใน Linux-kernel คำสั่ง git merge-base ลดขั้นตอนการทำงานจาก 167,441 ขั้นตอน เหลือเพียง 3,887 ขั้นตอนเท่านั้น
[source]
เพิ่มประสิทธิภาพ Path-walk Repacks สำหรับเซิร์ฟเวอร์
การทำ repack repository เพื่อประหยัดพื้นที่ ปกติจะใช้ name hash แต่เทคนิค path-walk จะดูตามตำแหน่งใน tree ซึ่งช่วยให้พบความสัมพันธ์แบบ delta ที่ดีกว่า ผลการทดสอบกับ Fluent UI repository พบว่าช่วยลดขนาด pack จาก 558.5 MB เหลือเพียง 164.4 MB หรือเล็กลงถึง 71%
ก่อนหน้านี้ path-walk มีข้อจำกัดในการใช้งานร่วมกับ reachability bitmaps และ delta islands ซึ่งเป็นหัวใจสำคัญของความเร็วในระดับเซิร์ฟเวอร์ แต่ใน Git 2.56 ข้อจำกัดเหล่านี้ได้ถูกทลายลงแล้ว ทำให้ผู้ให้บริการ repository ขนาดใหญ่สามารถประหยัดพื้นที่จัดเก็บได้โดยไม่สูญเสียความเร็วในการให้บริการ
ฟีเจอร์ใหม่อื่นๆ ที่น่าสนใจ
นอกจากฟีเจอร์หลักข้างต้น Git 2.56 ยังมีการอัปเดตย่อยที่น่าสนใจอีกมากมาย:
- git history drop: เพิ่มคำสั่งทดลองสำหรับลบ commit และ replay ประวัติส่วนที่เหลือลงบน parent โดยอัตโนมัติ
- git refs: รวบรวมคำสั่งจัดการ reference ระดับต่ำ เช่น create, update, delete และ rename ไว้ใต้เครื่องมือเดียว
- Bulk Branch Deletion: เพิ่ม
git branch --delete-mergedสำหรับลบสาขาที่รวมงานเสร็จแล้วแบบกลุ่ม พร้อมรองรับการทำ--dry-runเพื่อความปลอดภัย - Smart Typos: Git จะช่วยแนะนำคำสั่งที่ถูกต้องเมื่อคุณพิมพ์ผิด เช่น การใช้
git push origin/mainแทนที่ควรจะเป็นgit push origin main - Partial Clones Cleanup: สามารถสั่งทิ้ง (drop) blob ขนาดใหญ่ในเครื่องเพื่อคืนพื้นที่ แล้วค่อยดึงใหม่เมื่อจำเป็นผ่าน promisor remote
- Improved Log Graph: ปรับการแสดงผล
git log --graphให้ดูง่ายขึ้นสำหรับประวัติที่มีหลาย root commit
สำหรับการปรับปรุงประสิทธิภาพภายใน มีการแก้ไขปัญหาความล่าช้าใน repository ที่มี packfiles จำนวนมาก (ระดับ 37,000+ packs) จากเดิมที่บางคำสั่งอาจใช้เวลาถึง 4.5 วินาที หรือการทำ diff ที่เคยใช้เวลา 8 นาที ในปัจจุบันเหลือเพียงไม่กี่วินาทีเท่านั้น
ผู้ที่สนใจสามารถอ่านรายละเอียดฉบับเต็มได้ที่ release notes สำหรับ 2.56 หรือศึกษาผ่าน Git repository โดยตรง
ความคิดเห็น (0)
เข้าสู่ระบบเพื่อร่วมแสดงความเห็น
สมัครสมาชิกมาเป็นคนแรกที่แสดงความเห็นกันเลยโบร
