- Git ที่นักพัฒนาทั่วโลกใช้งาน กำลังผลักดันการเปลี่ยนแปลงเชิงโครงสร้างเพื่อเตรียมพร้อมสำหรับอีก 10 ปีข้างหน้า โดยมีการปรับปรุงหลักที่เน้นด้าน ความปลอดภัย ความสามารถในการขยายตัว และความใช้งานง่าย
- การเปลี่ยนแปลงที่เห็นได้ชัดที่สุดคือ การเปลี่ยนจาก SHA-1 ไปเป็น SHA-256 โดยมีแผนจะยกเลิกการใช้ SHA-1 ภายในปี 2030 แต่การนำมาใช้ยังล่าช้าเพราะระบบนิเวศยังรองรับไม่เพียงพอ
- กำลังมีความพยายามนำ Reftable มาใช้ เพื่อจัดการรีเฟอเรนซ์หลายล้านรายการอย่างมีประสิทธิภาพ และแก้ข้อจำกัดของไฟล์ซิสเต็มรวมถึงปัญหาด้าน concurrency
- เพื่อปรับปรุงการจัดการไฟล์ขนาดใหญ่ จึงมีการพัฒนา Large-object promisors และ ฐานข้อมูลอ็อบเจ็กต์แบบปลั๊กอิน โดยกำลังผสานเข้ากับ Git ทีละขั้นตั้งแต่เวอร์ชันหลัง Git 2.50 เป็นต้นไป
- ภายใต้อิทธิพลของระบบควบคุมเวอร์ชันรุ่นใหม่อย่าง Jujutsu นั้น Git กำลังพยายามรองรับเวิร์กโฟลว์สมัยใหม่ผ่านการทำ UI ให้ง่ายขึ้นและเพิ่มคำสั่งใหม่
เหตุผลที่ Git ต้องเปลี่ยนแปลง
- นับตั้งแต่เปิดตัวในปี 2005 Git ได้กลายเป็นเครื่องมือสำคัญที่มีรีโพซิทอรีหลายล้านแห่งและสคริปต์จำนวนมากพึ่งพามาตลอด 20 ปี
- อย่างไรก็ตาม การเปลี่ยนแปลงของสภาพแวดล้อม เช่น ช่องโหว่ความปลอดภัยของ SHA-1, การเพิ่มขึ้นของรีโพซิทอรีขนาดใหญ่ และ การแพร่หลายของ CI pipeline ได้เผยให้เห็นข้อจำกัดเชิงโครงสร้าง
- ความเป็นไปได้ของการชนกันของ SHA-1 ได้รับการพิสูจน์แล้วจาก การโจมตี SHAttered ของ CWI และ Google ในปี 2017
- จากพลังการประมวลผล GPU ที่เพิ่มขึ้น ทำให้องค์กรขนาดใหญ่เข้าถึงระดับที่สามารถคำนวณ hash collision ได้
- Git จำเป็นต้องเลือก วิวัฒนาการแบบค่อยเป็นค่อยไป แทนการออกแบบใหม่แบบพลิกโฉม และกำลังผลักดันการเปลี่ยนแปลงโดยยังคงความเข้ากันได้กับระบบนิเวศเดิม
การเปลี่ยนไปใช้ SHA-256
- Git 2.29 (ตุลาคม 2020) เพิ่ม การรองรับ SHA-256 แล้ว แต่แพลตฟอร์มหลักอย่าง GitHub ยังไม่รองรับ
- Git, Dulwich และ Forgejo รองรับเต็มรูปแบบ ส่วน GitLab, go-git และ libgit2 ยังอยู่ในขั้นรองรับแบบทดลอง
- แม้ SHA-1 จะถูกใช้เพื่อการตรวจสอบความถูกต้องของข้อมูลเป็นหลัก แต่ทั้งระบบนิเวศที่เกี่ยวข้องกับ ลายเซ็น, CI และสคริปต์ ต่างทำงานบนสมมติฐานเรื่องความทนทานต่อการชนกัน
- ตามข้อกำหนดของภาครัฐและภาคธุรกิจ จำเป็นต้องถอด SHA-1 ออกภายในปี 2030 และมีแผนให้ SHA-256 เป็นค่าเริ่มต้นใน Git 3.0
- เพื่อให้การเปลี่ยนผ่านในระบบนิเวศเกิดขึ้นได้ จึงแนะนำให้ผู้ใช้มีส่วนร่วมผ่าน การทดสอบเครื่องมือและการขอให้ฟอร์จรองรับ
การนำ Reftable มาใช้
- Git แบบเดิมใช้ โครงสร้าง loose reference ที่เก็บแต่ละรีเฟอเรนซ์เป็นไฟล์แยกกัน
- ในรีโพซิทอรีที่มีรีเฟอเรนซ์หลายสิบล้านรายการ วิธีนี้ไม่มีประสิทธิภาพ และก่อให้เกิดทั้ง ปัญหาการแยกตัวพิมพ์เล็กใหญ่ของไฟล์ซิสเต็ม และ ความไม่สอดคล้องกันด้าน concurrency
- Reftable เป็น โครงสร้างตารางบนฟอร์แมตไบนารี ที่ช่วยให้ทำ atomic update และจัดการรีเฟอเรนซ์ได้อย่างมีประสิทธิภาพ
- ในกรณีของรีโพซิทอรีที่ GitLab มีรีเฟอเรนซ์ 20 ล้านรายการ ไฟล์ packed-refs แบบเดิมต้องเขียนใหม่ถึง 2GB
- ใน Git 3.0 จะเปลี่ยนให้ Reftable เป็นแบ็กเอนด์เริ่มต้น และแนะนำให้ ใช้คำสั่ง Git แทนการเข้าถึงไฟล์โดยตรง
การปรับปรุงการจัดการไฟล์ขนาดใหญ่
- Git มีประสิทธิภาพกับการบีบอัดไฟล์ข้อความ แต่เมื่อ ไฟล์ไบนารีถูกแก้ไข จะต้องสร้างอ็อบเจ็กต์ทั้งหมดขึ้นใหม่ ทำให้เกิดความไม่มีประสิทธิภาพ
- จากการวิเคราะห์ของ GitLab พบว่า 75% ของพื้นที่รีโพซิทอรีถูกใช้โดยไฟล์ไบนารีขนาด 1MB ขึ้นไป
- ฟีเจอร์ Large-object promisors จะเก็บอ็อบเจ็กต์ขนาดใหญ่ไว้ในรีโมตสตอเรจแยกต่างหาก เพื่อให้ส่งผ่าน CDN หรือ S3 API ได้
- มีการทำ implementation ของโปรโตคอลเสร็จแล้วใน Git 2.50~2.52 และอยู่ในขั้นที่ฝั่งไคลเอนต์สามารถใช้งานได้
- ฐานข้อมูลอ็อบเจ็กต์แบบปลั๊กอิน จะนำฟอร์แมตจัดเก็บเฉพาะสำหรับไบนารีมาใช้ เพื่อรองรับการจัดเก็บแบบ incremental ในอนาคต
- Git 2.53 เพิ่มอินเทอร์เฟซฐานข้อมูลอ็อบเจ็กต์แบบรวมศูนย์ และคาดว่าจะมี proof of concept (PoC) ใน 2.54
การปรับปรุงส่วนติดต่อผู้ใช้
- คำสั่งของ Git ถูกวิจารณ์มาอย่างต่อเนื่องว่าซับซ้อนและขาดความสม่ำเสมอ ขณะที่ Jujutsu (JJ) ที่พัฒนาด้วย Rust กำลังถูกจับตามองในฐานะทางเลือก
- Jujutsu มีความสามารถอย่าง การจัดเรียงประวัติใหม่โดยอัตโนมัติ, การจัดการ conflict ในฐานะข้อมูล, และ แนวทางที่มอง commit เป็นเหมือนฉบับร่าง
- Git กำลังนำข้อดีบางส่วนของ Jujutsu มาใช้ โดยไม่ทำลายเวิร์กโฟลว์เดิม
- ใน Git 2.54 มีแผนเพิ่มคำสั่ง
git history split และ git history reword
- ในอนาคตยังมีแผนเพิ่ม ซับคอมมานด์สำหรับแก้ไขประวัติ อีกมากขึ้น
- Steinhardt เน้นว่า Git กำลังเรียนรู้ผ่านการแข่งขัน และ การทำ UI ให้ทันสมัยกับการยกระดับ usability กำลังเดินหน้าอยู่
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
Git เป็นซอฟต์แวร์ที่ งดงามจริง ๆ แต่ก็มีด้านที่เผยให้เห็นความซับซ้อนแบบที่ยึดโปรแกรมเมอร์เป็นศูนย์กลางอยู่ตรง ๆ
เคยลองสอน Git ให้คนที่ไม่ได้อยู่สายพัฒนา แล้วพวกเขาก็ไม่ได้ใช้ประโยชน์จาก พลังอันละเอียดอ่อน ของมันได้อย่างเต็มที่
เว็บไซต์อย่าง Learn Git Branching เป็นแหล่งเรียนรู้ที่ยอดเยี่ยม ถ้า UX แบบนี้ถูกหลอมรวมอยู่ในประสบการณ์พื้นฐานของ Git ก็น่าจะดี — อย่างเช่นค่าเริ่มต้นที่เข้าใจง่าย และลำดับการเรียนรู้แบบค่อยเป็นค่อยไป
ทุกวันนี้ถ้าใช้ agent CLI อย่าง Claude, Codex, OpenCode ก็สามารถมอบประสบการณ์แบบนี้ได้ไม่ยาก แต่ถ้า Git เองมี abstraction ที่เข้าถึงง่ายกว่านี้ ก็น่าจะทำให้ทุกอย่างง่ายขึ้นมาก
ตั้งตารอ Git 3.0 มาก แต่ขณะเดียวกันก็พร้อมจะ ผิดหวัง ได้ทันทีเหมือนกัน 😅
jjช่วยผู้ใช้ Git ได้มาก เพราะมันแสดงให้เห็นว่า VCS frontend ที่ใช้งานเข้าใจง่ายกว่า นั้นเป็นไปได้จริงเคยเห็นกรณีใน GitLab ที่มีการเขียนไฟล์ packed-refs ขนาด 2GB ทับใหม่ทุก ๆ ไม่กี่วินาที แล้วก็ไม่เข้าใจเลยว่า “ทำไมเรื่องแบบนี้ถึงเกิดขึ้นได้”
การเก็บไฟล์ขนาดใหญ่ไว้ภายนอกดูเหมือนเป็นการก้าวไปสู่โมเดลแบบรวมศูนย์ แต่ก็ขัดกับ ปรัชญาการออกแบบดั้งเดิม ของ Git
การเปลี่ยนผ่านออกจาก SHA1 กินเวลานานเกินไป
ฟังก์ชันแฮชน่าจะถูกออกแบบให้มี โครงสร้างแบบ modular มากกว่านี้ตั้งแต่แรก
คิดว่า Git ควรมีฟีเจอร์สำหรับ ติดตามไลเซนส์ซอฟต์แวร์ ในระดับ commit
ตัวอย่าง:
Co-Authored-By: Whatever LLM,License: WTFPL