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 ดังภาพด้านล่าง

 delta-based version control : ภาพจาก https://git-scm.com
Delta-based version control : ภาพจาก https://git-scm.com

แทนที่จะเก็บส่วนต่างระหว่าง Version, Git เก็บ Version ของ Source Code เป็น Snapshot และอ้างถึง File ที่ไม่มีการเปลี่ยนแปลงใน Version ก่อนหน้า ทุกครั้งที่มีการ Check-In มันจะถ่ายรูปไฟล์ของเราว่ามีหน้าตาเป็นอย่างไร (Snapshot) โดย Git มองข้อมูลที่จัดเก็บเป็นเหมือน File System เล็กๆ หนึ่ง ดังภาพด้านล่าง

snapshots version control : ภาพจาก https://git-scm.com 

ก่อนที่จะถูก 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

ซึ่งจะแสดงการเปลี่ยนสถานะของไฟล์ในส่วนต่างๆ ดังภาพด้านล่าง

Git Workflow : Working Directory, Staging area, and Git directory : ภาพจาก https://git-scm.com 

จากภาพด้านบน Workflow ของ Git มีกระบวนการดังนี้

เมื่อมีการเรียกคืน Source Code ใน Version หนึ่งๆ จาก Git Repository (Check Out), Source Code เหล่านั้นจะถูกนำมาวางที่ Working Directory

  1. เราจะแก้ไขไฟล์ใน Working Directory (ไฟล์ที่แก้ไขจะอยู่ในสถานะ Modified)
  2. รวบรวมไฟล์ที่ถูกแก้ไขลงใน Staging area เพื่อจะ Commit ใน Version ถัดไป (ไฟล์ที่ถูกรวบรวมจะอยู่ในสถานะ  Staged)
  3. Commit เพื่อนำไฟล์จาก Staging Area ไปจัดเก็บอย่างถาวรใน Local Repository (ไฟล์ที่ถูกบันทึกลง Repository อยู่ในสถานะ Commited)
ขอขอบคุณ Nipa.Cloud ที่ให้การสนับสนุน Environment ในการเรียนการสอน
รายวิชา Dev-Ops and Cloud Engineering 101