Git Fundamentals
Version Control concept
แยกแยะการก็อปไฟล์ตามอำเภอใจ เช่น report_v2_final ออกจากระบบ Version Control ที่บันทึกทุก snapshot พร้อมข้อมูลว่าใครแก้ อะไร และเมื่อไรอย่างเป็นระบบ
1) ปัญหา: ตั้งชื่อไฟล์ report_v2_final แล้วยังจำไม่ได้ว่าเปลี่ยนอะไร
ลองนึกถึงไฟล์เอกสารหนึ่งไฟล์ที่คุณแก้ไขต่อเนื่องมาหลายรอบ: `report.docx` กลายเป็น `report_v2.docx`, `report_v2_final.docx`, และสุดท้าย `report_v2_final_ใช้อันนี้จริง.docx` — ทุกครั้งที่แก้ไขสำคัญ คุณก็อปไฟล์เดิมไว้ก่อน แล้วตั้งชื่อใหม่ให้พอเดาได้ว่าเป็นเวอร์ชันไหน ปัญหาคือชื่อไฟล์บอกได้แค่ "มีหลายเวอร์ชัน" แต่บอกไม่ได้ว่าแต่ละเวอร์ชันต่างกันตรงไหน ใครเป็นคนแก้ หรือแก้ไปเมื่อไร ถ้าเพื่อนร่วมงานถามว่า "v2 กับ v2_final ต่างกันตรงไหน" คุณต้องเปิดทั้งสองไฟล์มาไล่เทียบเองทีละหน้า และถ้าจำไม่ได้ว่าใครเป็นคนแก้ล่าสุด ก็ไม่มีที่ไหนบันทึกไว้เลย
- ชื่อไฟล์บอกแค่ลำดับคร่าว ๆ ไม่บอกว่าเนื้อหาต่างกันตรงไหน
- ไม่มีที่บันทึกว่าใครแก้ ไฟล์นี้ ณ เวลาใด หรือแก้เพราะอะไร
- ยิ่งแก้หลายรอบ ยิ่งเดายากว่าไฟล์ไหนคือเวอร์ชันที่ใช้งานจริงล่าสุด
- ถ้าลืมก็อปไฟล์ไว้ก่อนแก้สักครั้งหนึ่ง ประวัติของการเปลี่ยนแปลงช่วงนั้นจะขาดหายไปถาวร
2) Core Model: บันทึกทุกจุดเปลี่ยนแปลงพร้อมใคร-อะไร-เมื่อไร
Version Control คือแนวคิดของการบันทึกความเปลี่ยนแปลงของงานชิ้นหนึ่งอย่างเป็นระบบ แทนที่จะพึ่งชื่อไฟล์หรือความจำของคนเป็นตัวบอกเวอร์ชัน ระบบจะเก็บทุกจุดเปลี่ยนแปลง (snapshot) ไว้เป็นข้อมูลจริง พร้อมบริบทกำกับสามอย่างเสมอ:
- Who — ใครเป็นคนบันทึกการเปลี่ยนแปลงนี้
- What — เปลี่ยนอะไรไปบ้างจากจุดก่อนหน้า และเปลี่ยนเพราะอะไร (ผ่านข้อความอธิบาย)
- When — บันทึกไว้เมื่อไร เรียงตามลำดับเวลาให้ย้อนดูได้เสมอ
โปรเจกต์ที่ถูกบันทึกด้วยวิธีนี้เรียกว่า Repository (repo) — Git ที่เรียนไปในบทก่อนหน้าคือหนึ่งใน Version Control System (VCS) ที่ทำสิ่งนี้ให้ แต่แนวคิด "บันทึกใคร-อะไร-เมื่อไรอย่างเป็นระบบ" เป็นหลักการทั่วไปของ version control ทุกระบบ ไม่ใช่เฉพาะ Git เท่านั้น
3) Anatomy: ทำไมการบันทึกอย่างเป็นระบบถึงต่างจากการตั้งชื่อไฟล์เอง
เมื่อระบบ version control บันทึก who/what/when ให้ทุกครั้ง ข้อมูลเหล่านี้จะกลายเป็น "ข้อมูลที่ค้นหาได้" ไม่ใช่แค่ตัวอักษรในชื่อไฟล์ที่มนุษย์ต้องตีความเอง ระบบสามารถตอบได้ทันทีว่าเวอร์ชันไหนถูกบันทึกล่าสุด ใครเป็นคนบันทึก และมีเวอร์ชันอะไรบ้างระหว่างทาง โดยไม่ต้องเปิดไฟล์มาเทียบเอง ลองทำนายก่อนอ่านต่อ: ถ้าไม่มีระบบ version control และทีมงานสองคนแก้ไฟล์เดียวกันคนละช่วงเวลาโดยไม่รู้ตัว คุณคิดว่าจะรู้ได้อย่างไรว่าใครแก้อะไรไปก่อนหรือหลังกัน? คำตอบคือ ถ้าไม่มีระบบบันทึกที่เชื่อถือได้ คุณต้องถามกันเองหรือเดาจากเวลาที่ไฟล์ถูกแก้ไขล่าสุดบนเครื่อง ซึ่งไม่แม่นยำและไม่มีบริบทว่าทำไมถึงแก้ ส่วนระบบ version control ที่บันทึก who/what/when ไว้ในทุกจุดเปลี่ยนแปลง จะตอบคำถามนี้ได้ทันทีจากประวัติที่มีอยู่แล้ว
4) Contrast: การก็อปไฟล์ตามอำเภอใจ เทียบกับ Version Control อย่างเป็นระบบ
Ad-hoc copies เทียบกับ Systematic Version Control
บริบทอยู่ในข้อมูล ไม่ใช่ในชื่อไฟล์
Version control เก็บ who/what/when เป็นข้อมูลกำกับทุก snapshot ส่วนการก็อปไฟล์ตามอำเภอใจมีแค่ชื่อไฟล์ที่มนุษย์ตั้งเอง ตีความไม่ตรงกันได้
ทุกจุดเปลี่ยนแปลงอยู่ในที่เดียวกัน
Repository เก็บทุกเวอร์ชันไว้เป็นลำดับเวลาเดียว ไม่ต้องสร้างไฟล์ใหม่กระจัดกระจายแบบ v2, v2_final, v2_final_ใช้จริง
ไม่พึ่งวินัยของมนุษย์ในการก็อปทุกครั้ง
การก็อปไฟล์ตามอำเภอใจต้องอาศัยให้คนจำได้ว่าต้องก็อปก่อนแก้ทุกครั้ง ถ้าลืมแม้ครั้งเดียว ประวัติช่วงนั้นหายไปถาวร
ตอบคำถามอดีตได้จากข้อมูล ไม่ต้องเดา
เมื่อใคร ๆ ถามว่าเวอร์ชันไหนต่างจากอีกเวอร์ชันตรงไหน ระบบ version control ตอบได้จากประวัติที่บันทึกไว้จริง ไม่ต้องเปิดไฟล์มาไล่เทียบเอง
5) ฝึกทำนาย: วิธีไหนเสี่ยงข้อมูลสูญหาย
ทำนายผลลัพธ์ก่อนดูเฉลย: เปรียบเทียบสองสถานการณ์ต่อไปนี้ แล้วบอกว่าสถานการณ์ไหนมีความเสี่ยงที่ข้อมูลระหว่างทางจะสูญหายอย่างกู้คืนไม่ได้ และเพราะอะไร
งานที่ต้องทำ
- ทำนายว่าสถานการณ์ A (ก็อปไฟล์ด้วยมือก่อนแก้ทุกครั้ง) หรือสถานการณ์ B (ใช้ระบบ version control บันทึกทุกครั้งที่สั่ง) เสี่ยงข้อมูลสูญหายมากกว่ากัน
- อธิบายว่าจุดที่ทำให้ข้อมูลสูญหายในสถานการณ์ที่เสี่ยงกว่าคืออะไร
ตัวอย่างและข้อมูลประกอบ
สถานการณ์ A: คุณแก้ `report.docx` มาสามรอบ แต่ก็อปไฟล์เก็บไว้เป็นเวอร์ชันสำรองแค่สองครั้ง (ลืมก็อปครั้งที่สาม) ก่อนจะแก้ไฟล์จริงต่อในรอบที่สี่จนพัง สถานการณ์ B: คุณใช้ระบบ version control บันทึก snapshot ทุกครั้งที่แก้เสร็จหนึ่งรอบ รวมสี่ครั้ง ก่อนจะพบว่ารอบที่สี่มีปัญหา
ลองทำด้วยตัวเองก่อน แล้วค่อยเปิดเฉลยเพื่อเทียบแนวคิดและรายละเอียด
6) Checkpoint & Next Steps
ทดสอบความเข้าใจ: Version Control concept
ตอบคำถามเพื่อเช็กความเข้าใจแนวคิด version control และความต่างจากการก็อปไฟล์ตามอำเภอใจ
ข้อมูลสามอย่างที่ระบบ version control บันทึกกำกับไว้กับทุกจุดเปลี่ยนแปลงคือข้อใด?
ข้อใดอธิบายความเสี่ยงหลักของการก็อปไฟล์ตามอำเภอใจ (ad-hoc copies) ได้ถูกต้องที่สุด?
โปรเจกต์ที่ถูกบันทึกความเปลี่ยนแปลงด้วยระบบ version control อย่างเป็นระบบ เรียกว่าอะไร?
ตอบเป็นคำศัพท์ภาษาอังกฤษคำเดียวตามที่ใช้ในบทเรียน
- Version Control บันทึกทุกจุดเปลี่ยนแปลงพร้อม who/what/when อย่างเป็นระบบ แทนการพึ่งชื่อไฟล์
- Ad-hoc copies พึ่งวินัยของคน ลืมก็อปครั้งเดียวข้อมูลช่วงนั้นหายถาวร
- Git คือหนึ่งใน Version Control System ที่ทำแนวคิดนี้ให้อัตโนมัติ
- ก้าวต่อไป: บทถัดไปคือ Git vs GitHub / GitLab ซึ่งต่อยอดจากความเข้าใจเรื่อง Version Control และ Git ในสองบทก่อนหน้า เพื่อแยกแยะว่าอะไรคือตัว Git เองและอะไรคือแพลตฟอร์ม hosting ที่สร้างขึ้นมาบน Git