Commit คืออะไร
เรียนรู้ว่า commit คือ snapshot ของไฟล์ ณ เวลาที่บันทึก และทำไมมันถึงต่างจากการเซฟไฟล์ปกติ
ถ้าคุณเขียนไฟล์ไปเรื่อยๆ แล้ววันนึงอยากย้อนกลับไปดูว่าเมื่อก่อนเขียนอะไรไว้ คุณจะทำยังไง
ปกติเวลาเราแก้ไฟล์ ของเก่าจะถูกเขียนทับด้วยของใหม่ไปตลอดกาล แต่ Git ทำต่างจากนั้น Git จะเก็บ snapshot ของไฟล์ทุกครั้งที่คุณบอกให้มัน “บันทึก” snapshot แต่ละครั้ง เราเรียกว่า commit
ลองเล่นดู
กดปุ่ม ทำ commit ใหม่ ข้างล่าง สังเกตว่าทุกครั้งที่กด commit ใหม่จะโผล่ขึ้นมาด้านบน commit เก่าไม่หายไปไหน Git เก็บไว้ทุกก้อน
ยังไม่มี commit กดปุ่มข้างบนเพื่อทดลอง
กว่าจะได้ commit 1 ก้อน ต้องทำอะไรบ้าง
Widget ด้านบนใช้ปุ่มเดียว แต่ใน terminal จริงๆ Git มี 3 ขั้น
git init(ทำครั้งเดียวต่อ project) บอก Git ว่า “ต่อจากนี้ให้ track folder นี้” Git จะสร้างโฟลเดอร์ซ่อนชื่อ.git/ไว้เก็บประวัติทั้งหมดgit add <file>เลือกไฟล์ที่จะใส่ใน commit ก้อนถัดไป ขั้นนี้เรียกว่าเอาไฟล์เข้า staging areagit commit -m "message"สร้าง commit จริง รวม staging area เป็น snapshot พร้อม message ที่คุณเขียน
Staging area = “ตะกร้า” ก่อน commit
Git แบ่งไฟล์ของคุณออกเป็น 3 โซน คิดง่ายๆ เหมือนการไปซูเปอร์
- Working directory = ไฟล์ที่คุณกำลังแก้บนดิสก์ (ของบนชั้น)
- Staging area (index) = ไฟล์ที่
git addแล้ว รอ commit (ของในตะกร้า) - Repository = commit ทุกก้อนที่บันทึกไปแล้ว (ของที่ชำระเงินแล้ว)
Staging มีประโยชน์ตรงที่ถ้าแก้ไป 5 ไฟล์ แต่อยากรวม commit เฉพาะ 2 ไฟล์ที่เกี่ยวกับเรื่องเดียวกัน ก็ทำได้ ด้วย git add file1 file2 แล้ว git commit อีก 3 ไฟล์ที่เหลือค่อย commit ทีหลัง
Commit 1 ก้อน มีอะไรอยู่ข้างใน
Commit ไม่ใช่แค่ “เซฟ” มันเก็บข้อมูลครบเซ็ตที่ทำให้เรารู้ว่าใครทำ ทำอะไร เมื่อไหร่ และต่อจาก commit ไหน ลองคลิกส่วนต่างๆ ของ commit ด้านล่างเพื่อดูคำอธิบายของแต่ละส่วน
ชื่อเฉพาะของ commit นี้ สร้างจากเนื้อหา commit ไม่ซ้ำใคร ใช้อ้างอิงได้ตรง
ไฟล์ปกติ เทียบกับ Git
ความต่างที่ชัดที่สุดระหว่างการเซฟไฟล์แบบปกติ (overwrite) กับการ commit (snapshot) คือเรื่องของประวัติ ลองเล่น widget ข้างล่าง กดปุ่ม แก้ไขไฟล์ ดูทั้งสองฝั่งเปลี่ยนพร้อมกัน แล้วสังเกตว่าฝั่งซ้ายของเก่าหายไปเลย ส่วนฝั่งขวาของเก่ายังอยู่ทุกเวอร์ชัน
e745a30initial commitHEAD
สรุป
- Commit คือ snapshot ของไฟล์ ณ เวลาที่คุณบันทึก
- Commit ทุกก้อนมี hash (ชื่อ) + parent (ต่อจาก commit ก่อน) + author + date + message
- Git เก็บ commit ทุกก้อนไว้ ต่างจากไฟล์ปกติที่ overwrite ของเก่าทิ้ง
ใน lesson ถัดไป เราจะไปดูว่า branch คืออะไร ทำให้ commit ไม่ต้องเรียงเป็นเส้นตรง สามารถแยกเป็น path ย่อยๆ ทำงานหลายเรื่องพร้อมกันได้ยังไง