Reset + Reflog: Git ไม่ลืม
กู้ commit ที่คิดว่าหายไปแล้ว รู้จัก 3 mode ของ reset และวิธีใช้ reflog เป็น safety net
ถ้าจะมีบทเดียวที่ทำให้คุณมอง Git เปลี่ยนไปตลอดกาล ก็คือบทนี้Git ไม่ลืม ทุก commit ที่เคยเกิดขึ้น Git เก็บไว้หมด อย่างน้อย 90 วัน ดังนั้นถ้ากดอะไรผิด อย่าเพิ่งตกใจ recover กลับได้เกือบทุกกรณี
Reset คืออะไร
git reset คือการย้าย pointer (ลูกศรที่ชี้ว่า branch อยู่ที่ commit ไหน) ของ branch ไปยัง commit ก้อนอื่น มี 3 mode: --soft, --mixed (default), --hard
--soft= ย้าย HEAD อย่างเดียว ไฟล์ในดิสก์ + staging ไม่แตะ--mixed= ย้าย HEAD + ล้าง staging ไฟล์ในดิสก์ยังอยู่--hard= ย้าย HEAD + ล้าง staging + ล้างไฟล์ในดิสก์ด้วย
ที่คนกลัวคือ --hard เพราะถ้าคุณมีไฟล์ที่แก้ค้างอยู่ยังไม่ commit ไฟล์นั้นหายไปทันที แต่ถ้า commit ไปแล้ว commit ไม่ได้ “หาย” จริง แค่ pointer ไม่ชี้มันแล้ว
Reflog คือ safety net
git reflog คือ log ที่ Git เก็บ ทุกครั้ง ที่ HEAD เคลื่อน รวมถึง commit, checkout, merge, reset, rebase ทุกอย่าง แต่ละ entry มี hash ทำให้คุณกลับไปที่จุดนั้นได้เสมอ
ลองทำลายแล้ว recover ด้วยตัวเอง
ด้านล่างมี commit chain 3 ก้อน ลอง:
- กด “commit ใหม่” 2-3 ครั้ง → ประวัติยาวขึ้น
- กด “reset --hard HEAD~2” → commit “หาย” (จางลง)
- ดู reflog ฝั่งขวา → hash ของ commit ที่หายยังอยู่ครบ
- คลิก entry ใน reflog → HEAD ย้ายกลับ → commit กลับมาใช้ได้
a3f8c21initial commite91b7d4เพิ่ม README5f2a8c9ตั้งค่า CIHEAD
Git บันทึกทุกครั้งที่ HEAD เคลื่อน แม้ commit ถูก reset ไป reflog ก็ยังเก็บ hash ให้ เอาคืนได้ภายใน 90 วัน
Reset vs Revert
สองคำนี้ฟังคล้ายแต่ทำคนละอย่าง
- Reset เขียนประวัติใหม่ ลบ commit ออกจาก branch (ยังอยู่ใน reflog) เหมาะกับ commit ที่ยังไม่ push
- Revert สร้าง commit ใหม่ที่มี diff ตรงข้าม ไม่ลบประวัติเดิม เหมาะกับ commit ที่ push ไปแล้วและมีคนใช้อยู่
กรณีฉุกเฉินที่เจอจริง
สรุป
- Reset ย้าย HEAD pointer มี 3 mode: soft, mixed, hard
- Reset --hard อันตรายกับไฟล์ที่ยังไม่ commit (ไม่มี safety net)
- Reflog เก็บทุก HEAD movement อย่างน้อย 90 วัน ใช้ recover commit ที่ “หาย”
- Reset บน commit ที่ยังไม่ push ได้ แต่ commit ที่ push แล้วให้ใช้ revert
- Git ไม่ลืม ก่อนตกใจ ลอง git reflog ก่อน
lesson สุดท้ายจะรวมทุกอย่างที่เรียนมาเป็น feature branch workflow ของจริงในทีม เห็นภาพรวมว่า เวลาทำงานจริงใช้คำสั่งไหน ลำดับไหน