Commit ID ในระบบ Git คือ SHA-1 Hash ซึ่งสร้างจากเนื้อหาของ Commit แต่ละครั้ง ฟีเจอร์นี้ให้ Git ที่มีการกระจาย (Distributed) ได้อย่างปลอดภัย โดยรับประกันว่าทุก Commit มีตัวอักษรเฉพาะตัว
SHA-1 Hash คืออะไร
SHA-1 (Secure Hash Algorithm 1) คือฟังก์ชันแฮชที่ใช้ในการสร้าง Commit ID ในระบบ Git โดยมีลักษณะดังนี้:
- ใช้วิธี Content-based Addressing ในการระบุตำแหน่ง Commit
- สร้างค่าแฮชที่มีความยาว 40 ตัวอักษร (Hexadecimal)
- ตรวจสอบว่า Commit ไม่ได้รับการเปลี่ยนแปลง (Integrity)
- ยืนยันตัวตนและความถูกต้องของ Repository
ตัวอย่างรูปแบบ SHA-1 Hash:
abc123d456ef7890ab12c3d456ef7890ab12c3d
ทำไม Git Commit มี ID ยาว 40 ตัวอักษร
SHA-1 Algorithm ส่งออกค่าแฮชในรูปแบบเลขฐาน 16 (Hexadecimal) ที่มี 160 บิต (bits) ในการคำนวณแล้ว เมื่อแปลงเป็นเลขฐาน 16 จะได้ความยาวกำหนดดังนี้:
- 160 บิต ÷ 4 บิต (ต่อตัวอักษร Hexadecimal) = 40 ตัวอักษร
- แต่ละตัวอักษรแทนค่า 0-9 และ a-f (16 ค่าที่เป็นไปได้)
- จำนวนรวม Commit ที่เป็นไปได้: 2^160 (ประมาณ 1.46 × 10^48)
Commit ID ถูกสร้างจากข้อมูลอะไร
SHA-1 Hash สร้างขึ้นจากรวมหลายประเภทข้อมูล ทำให้แต่ละ Commit มี ID ที่ไม่ซ้ำกัน:
SHA-1(input) ที่มาจากข้อมูลต่อไปนี้:
• Parent Commit Hash
• Tree (Structure ของไฟล์)
• Author Name และ Email
• Commit Message
• Timestamp (วันและเวลา Commit)
ถ้าเปลี่ยนแปลงข้อมูลใดข้อมูลหนึ่ง Hash ก็จะเปลี่ยนไปโดยสิ้นเชิง นี่คือความปลอดภัยหลักของ Git
ดูตัวอย่าง Commit ID ในจริง
# ดู Full SHA-1 Hash (40 ตัวอักษร)
git log --no-decorate
# Output:
# abc123d456ef7890ab12c3d456ef7890ab12c3d
# ดู Short SHA-1 Hash (7 ตัวอักษรแรก)
git log --oneline
# Output: abc123d Add new feature X
# ดู Commit Details
git show abc123d
# กำหนดความยาว Short Hash (Default 7)
git log --abbrev=12
# Output: abc123d456ef Add new feature X
ทำไม Git ใช้ Content-based Addressing
วิธีนี้เสนอประโยชน์มากมายสำหรับ Version Control:
- Data Integrity: ตรวจสอบว่าข้อมูล Repository ไม่เสียหายหรือถูกแก้ไข
- Distributed Safety: ทำให้ Git นิรภัยในการทำงานแบบ Decentralized
- Conflict Detection: ตรวจจับ Merge Conflicts ได้ง่ายและแม่นยำ
- Authenticity: ยืนยันว่า Commit มาจากแหล่งที่ถูกต้อง
- Deduplication: ไม่เก็บ Commit ที่เหมือนกันหลายครั้ง
Short Hash vs Full Hash
Git อนุญาตให้ใช้ Short Hash ได้ แต่ยังคงความปลอดภัยและเสถียรภาพ:
# Full Hash - ใช้ 40 ตัวอักษรทั้งหมด
abc123d456ef7890ab12c3d456ef7890ab12c3d
# Short Hash - ใช้ 7 ตัวอักษร (Default)
abc123d
# Custom Short Hash - ใช้ความยาวตามที่ต้องการ
git log --abbrev=10 # ใช้ 10 ตัวอักษร
git log --abbrev=15 # ใช้ 15 ตัวอักษร
# Git จะขยายอัตโนมัติถ้า Short Hash ไม่เฉพาะเจาะจง
git log --abbrev=5 # อาจขยายไปกว่า 5 ตัวอักษร
SHA-256 Migration – อนาคตของ Git
Git กำลังเคลื่อนไปสู่ SHA-256 เนื่องจากความเสี่ยงของ SHA-1:
- Git 2.29+: เริ่มสนับสนุน SHA-256 Algorithm
- ความยาว: 64 ตัวอักษร (แทนที่ 40 ตัวอักษร)
- ความปลอดภัย: ยิ่งปลอดภัยกว่า SHA-1 ด้วยพลังการคำนวณที่สูงขึ้น
- Backward Compatibility: Git ยังรองรับ SHA-1 ในขณะนี้
ความเสี่ยง: SHA-1 Collision
ในปี 2017 ผู้วิจัยค้นพบวิธีสร้าง Collision สำหรับ SHA-1 แต่ Github และ Git ecosystem ปฏิบัติเพื่อลดความเสี่ยง:
# ตรวจสอบค่า Hash ของ Commit
git cat-file -p abc123d456ef7890ab12c3d456ef7890ab12c3d
# ตรวจสอบ Signature ของ Commit
git log --show-signature
# ลงนามใน Commit ด้วย GPG Key
git commit -S -m "Signed commit message"
วิธีป้องกัน SHA-1 Collision:
- GitHub ปฏิเสธ Push ของ SHA-1 Collision Objects
- ใช้ Signed Commits เพื่อยืนยันตัวตน
- ติดตาม Git 2.29+ และ SHA-256 Transition Plan
- ตรวจสอบและอัปเดต Git ให้เป็นรุ่นล่าสุด
- ตรวจสอบความถูกต้องของ Deployment โดยการยืนยัน Commit Hash
- ติดตาม Rollback โดยการอ้างอิง Full Hash หรือ Short Hash
- ยืนยันว่า Server ของคุณกำลังรัน Commit ที่ถูกต้องเสมอ
- ใช้ Signed Commits สำหรับ Production Environment
สรุป: SHA-1 Hash ที่มีความยาว 40 ตัวอักษรให้ Git ความสามารถในการยืนยัน Integrity และ Authenticity ของ Repository อย่างแข็งแกร่ง ทำให้นักพัฒนาสามารถทำงานบน Distributed System ได้อย่างปลอดภัยและมั่นใจ
