Version Control and Git From Zero to Hero : Part 2
บทความโดย ผศ.ดร.ณัฐโชติ พรหมฤทธิ์
ภาควิชาคอมพิวเตอร์
คณะวิทยาศาสตร์
มหาวิทยาลัยศิลปากร
Git vs other VCS
Git เป็น Distributed Version Control System ซึ่งต้องมีการ Copy Version ของ Source Code มาเก็บไว้ที่ Local host ก่อน ทำให้ผู้ใช้สามารถแก้ไข Project ได้ทุกที่แบบ Offline และ Check-In Source Code บน Local Repository โดยไม่ต้องติดต่อกับ Repository บน Server (Remote Repository) พอแก้ไขเสร็จแล้วก็ค่อยสั่ง Sync ข้อมูล (Pull/Merge/Push) ทีหลัง
ดังนั้นเมื่อเราสามารถทำทุกอย่างบน Local Host ได้ มันจึงเร็วกว่า SVN ที่เป็น Centralized Version Control System อย่างมาก
นอกจากนี้ Git ยังมีความแตกต่างกับ Version Control System อื่นๆ ในเรื่องของการจัดเก็บข้อมูล Version โดย Version Control System ทั่วไปจะเก็บเป็น Link ของความเปลี่ยนแปลง หรือส่วนต่างระหว่าง Version ดังภาพด้านล่าง
แทนที่จะเก็บส่วนต่างระหว่าง Version, Git เก็บ Version ของ Source Code เป็น Snapshot และอ้างถึง File ที่ไม่มีการเปลี่ยนแปลงใน Version ก่อนหน้า ทุกครั้งที่มีการ Check-In มันจะถ่ายรูปไฟล์ของเราว่ามีหน้าตาเป็นอย่างไร (Snapshot) โดย Git มองข้อมูลที่จัดเก็บเป็นเหมือน File System เล็กๆ หนึ่ง ดังภาพด้านล่าง
ก่อนที่จะถูก Save ทุกอย่างใน Version จะถูกหา Checksum โดยใช้ SHA-1 hash ดังนั้นจึงไม่มีทางที่เราจะเปลี่ยนแปลงข้อมูลใน File และ Folder โดย Git จะไม่รู้ เราจะใช้ค่า Checksum ในการอ้างถึง Version ของ Source Code ในหลายๆ งานครับ SHA-1 hash มีหน้าตาดังภาพด้านล่าง
e70cdec636912065839fed45238db9d4f898f199
Git Work Flow
แก่นของ Git ที่ต้องเข้าใจก่อนใช้งาน คือ Git แบ่งสถานะของไฟล์ที่มันจะติดตาม (Tracked) เป็น 3 สถานะ คือ Modified, Staged และ Committed
สถานะ Modified หมายถึงเราได้แก้ไขไฟล์ไปแล้ว แต่ยังไม่เริ่มกระบวนการจัดเก็บลง Repository
สถานะ Staged หมายถึงเราได้ทำเครื่องหมาย File ที่ได้ถูกแก้ไข เพื่อจะบันทึกใน Version หน้า
สถานะ Committed หมายถึงข้อมูลถูกบันทึกอย่างปลอดภัยใน Repository บน Local Host
ซึ่งจะแสดงการเปลี่ยนสถานะของไฟล์ในส่วนต่างๆ ดังภาพด้านล่าง
จากภาพด้านบน Workflow ของ Git มีกระบวนการดังนี้
เมื่อมีการเรียกคืน Source Code ใน Version หนึ่งๆ จาก Git Repository (Check Out), Source Code เหล่านั้นจะถูกนำมาวางที่ Working Directory
- เราจะแก้ไขไฟล์ใน Working Directory (ไฟล์ที่แก้ไขจะอยู่ในสถานะ Modified)
- รวบรวมไฟล์ที่ถูกแก้ไขลงใน Staging area เพื่อจะ Commit ใน Version ถัดไป (ไฟล์ที่ถูกรวบรวมจะอยู่ในสถานะ Staged)
- Commit เพื่อนำไฟล์จาก Staging Area ไปจัดเก็บอย่างถาวรใน Local Repository (ไฟล์ที่ถูกบันทึกลง Repository อยู่ในสถานะ Commited)
- Version Control and Git From Zero to Hero : Part 1
- Version Control and Git From Zero to Hero : Part 2
- Version Control and Git From Zero to Hero : Part 3
- Version Control and Git From Zero to Hero : Part 4 (การใช้งาน Git ร่วมกับ Jupyter Notebook)
- Version Control and Git From Zero to Hero : Part 5 (Fixing the Mistakes)
- Version Control and Git From Zero to Hero : Part 6 (แนวคิดของ Branch)
- Version Control and Git From Zero to Hero : Part 7.1 (Branch Management)
รายวิชา Dev-Ops and Cloud Engineering 101