Git Fundamentals
What is Git
อธิบายว่า Git คืออะไร ทำไม "ก็อปโฟลเดอร์เก็บไว้" ถึงไม่ใช่ version control และแยกแยะแนวคิด repository, snapshot, และ history เพื่อเข้าใจการติดตามโปรเจกต์ด้วย Git
1) ปัญหา: ทำไม "ก็อปโฟลเดอร์เก็บไว้" ถึงไม่ใช่ version control
ลองนึกถึงเหตุการณ์นี้: คุณกำลังแก้หน้าเว็บอยู่ในโฟลเดอร์ `project` ก่อนจะลองทำอะไรเสี่ยง ๆ คุณก็อปทั้งโฟลเดอร์เก็บไว้เป็น `project-backup` เผื่อพัง ผ่านไปสองสัปดาห์ คุณมี `project`, `project-backup`, `project-final`, และ `project-final-v2` อยู่บนเครื่อง แต่ละโฟลเดอร์คือทั้งโปรเจกต์ก็อปมาทั้งดุ้น ไม่ใช่แค่ส่วนที่เปลี่ยน ตอนนี้ถ้ามีคนถามว่า "`project-final` กับ `project-final-v2` ต่างกันตรงไหน" คุณตอบไม่ได้ทันที ต้องเปิดไฟล์ทีละคู่มาเทียบเอง และถ้าอยากเอาแค่การแก้ไข CSS จาก `project-final-v2` มาใส่ใน `project-final` ก็ต้องก็อปวางเอง ไม่มีเครื่องมือช่วยบอกว่าไฟล์ไหนเปลี่ยนไปบ้าง
- ไม่รู้ว่าสองโฟลเดอร์ต่างกันตรงไหน โดยไม่เปิดไฟล์มาเทียบเอง
- ไม่มีบันทึกว่าเปลี่ยนอะไร เมื่อไร หรือทำไมถึงเปลี่ยน
- กู้คืนไฟล์เดียวจากอดีตโดยไม่กระทบไฟล์อื่นทำไม่ได้ ต้องทับทั้งโฟลเดอร์
- ยิ่งมีหลายโฟลเดอร์ ยิ่งสับสนว่าอันไหนคือเวอร์ชันล่าสุดที่ใช้งานจริง
2) Core Model: Repository, Snapshot, และ History
Git แก้ปัญหานี้ด้วยแนวคิดที่ต่างจากการก็อปโฟลเดอร์โดยสิ้นเชิง แทนที่จะสร้างโฟลเดอร์ใหม่ทั้งก้อนทุกครั้ง Git จะบันทึก "การเปลี่ยนแปลง" ไว้ในที่เดียว แล้วให้คุณย้อนกลับไปดูช่วงเวลาไหนก็ได้ตามต้องการ สามคำที่เป็นหัวใจของโมเดลนี้คือ
- Repository (repo) — โฟลเดอร์ที่ Git กำลังติดตามการเปลี่ยนแปลงอยู่ ไม่ใช่โฟลเดอร์ธรรมดา
- Snapshot (หรือ commit) — ภาพนิ่งของไฟล์ทั้งหมดในโปรเจกต์ ณ ช่วงเวลาหนึ่งที่คุณสั่งให้ Git บันทึกไว้
- History — ลำดับของ snapshot ทั้งหมดที่เคยบันทึกไว้ เรียงตามเวลา เปิดดูย้อนหลังได้ทุกจุด
3) Anatomy: การ "track" โปรเจกต์ด้วย Git หมายความว่าอย่างไร
เมื่อโฟลเดอร์หนึ่งกลายเป็น repository แล้ว Git จะเริ่มสังเกตทุกไฟล์ในนั้น แต่ Git ไม่ได้ก็อปทั้งโฟลเดอร์ซ้ำทุกครั้งที่บันทึก — มันจดจำเฉพาะสิ่งที่เปลี่ยนไปจาก snapshot ก่อนหน้า แล้วประกอบภาพรวมขึ้นมาใหม่ได้เสมอเมื่อคุณต้องการดู เพราะ Git รู้ว่าไฟล์แต่ละบรรทัดเปลี่ยนไปอย่างไรระหว่าง snapshot สองจุด มันจึงตอบได้ว่า "ไฟล์นี้ต่างจากเมื่อสามวันก่อนตรงไหน" และกู้คืนไฟล์เดียวกลับไปเป็นเวอร์ชันเก่าได้ โดยไม่กระทบไฟล์อื่นในโปรเจกต์เลย ลองทำนายก่อนอ่านต่อ: ถ้าคุณลบไฟล์ทิ้งโดยไม่ได้ตั้งใจ หลังจากที่เคยบันทึก snapshot ที่มีไฟล์นั้นไปแล้ว คุณคิดว่า Git จะช่วยอะไรได้บ้าง? คำตอบคือ Git ยังมีสำเนาของไฟล์นั้นอยู่ใน snapshot เก่า ตราบใดที่เคยบันทึกไว้ก่อนไฟล์หาย คุณสามารถขอให้ Git คืนไฟล์นั้นกลับมาได้ — นี่คือประโยชน์ที่การก็อปโฟลเดอร์ด้วยมือให้ไม่ได้ เพราะถ้าลืมก็อปครั้งใดครั้งหนึ่ง งานในช่วงนั้นจะหายไปถาวร
4) Contrast: Version control เทียบกับการก็อปโฟลเดอร์ / Undo มือ
ทำไม Git ต่างจากการก็อปโฟลเดอร์เก็บไว้เอง
เก็บทุกเวอร์ชันไว้ในที่เดียว
Git เก็บทุก snapshot ไว้ใน repository เดียว ไม่ต้องสร้างโฟลเดอร์ซ้ำแบบ project-final, project-final-v2 ให้สับสน
กู้คืนไฟล์เดียวได้แบบเจาะจง
เลือกย้อนไฟล์ใดไฟล์หนึ่งกลับไปยัง snapshot ก่อนหน้าได้ โดยไม่กระทบไฟล์อื่น ต่างจากการก็อปโฟลเดอร์ทั้งก้อนที่ต้องทับทุกอย่าง
รู้ว่าเปลี่ยนอะไรและทำไม
แต่ละ snapshot มาพร้อมข้อความอธิบายเจตนาที่คุณเขียนไว้เอง การก็อปโฟลเดอร์ไม่มีข้อความอธิบายใด ๆ ติดมา ต้องเดาเอาเอง
การก็อปโฟลเดอร์ไม่ใช่ backup ที่ปลอดภัย
ถ้าลืมก็อปหรือก็อปผิดจังหวะ งานที่หายไปจะไม่มีทางกู้คืนได้ ต่างจาก Git ที่บันทึก snapshot ไว้ทุกครั้งที่คุณสั่งอย่างตั้งใจ
5) Checkpoint & Next Steps
ทดสอบความเข้าใจ: Git คืออะไร
ตอบคำถามเพื่อเช็กความเข้าใจแนวคิด repository, snapshot, และ history
ข้อใดอธิบาย "repository" ใน Git ได้ถูกต้องที่สุด?
ข้อใดคือข้อจำกัดของการ "ก็อปโฟลเดอร์เก็บไว้" เทียบกับการใช้ version control?
ลำดับของ snapshot ทั้งหมดที่ Git เคยบันทึกไว้ เรียงตามเวลา เรียกว่าอะไร?
ตอบเป็นคำศัพท์ภาษาอังกฤษคำเดียวตามที่ใช้ในบทเรียน
- Repository คือโฟลเดอร์ที่ Git ติดตาม, Snapshot คือภาพนิ่งของไฟล์ ณ เวลาหนึ่ง, History คือลำดับ snapshot ทั้งหมด
- การก็อปโฟลเดอร์เก็บไว้ไม่มีบริบท ไม่มีข้อความอธิบาย และกู้คืนเจาะจงไฟล์เดียวไม่ได้
- ก้าวต่อไป: บทถัดไปคือ Version Control concept ซึ่งต่อยอดจากความเข้าใจเรื่อง Git ในบทนี้โดยตรง ไม่ต้องรู้คำสั่งใด ๆ มาก่อน