ทำความรู้จักกับ git reset ง่ายๆ

Oct. 23, 2024 · boychawin

Git ที่เรามักใช้กันเพื่อจัดการ source code คำสั่งหนึ่งที่ทุกคนควรรู้จักและเข้าใจคือ git reset คำสั่งนี้ช่วยให้เราย้อนสถานะหรือยกเลิกการเปลี่ยนแปลงในหลายระดับ ไม่ว่าจะเป็นการยกเลิกการ commit, การยกเลิก staging ไฟล์ หรือแม้แต่ล้างทุกอย่างกลับไปเหมือน commit เดิม

มาดูกันว่าทำไม git reset ถึงมีประโยชน์และใช้งานได้ง่ายๆ (ถ้าเข้าใจ!)

ประเภทของการใช้งาน git reset

git reset มี 3 รูปแบบหลักๆ ที่เรามักจะใช้งาน มันดูคล้ายกัน แต่ก็ให้ผลที่แตกต่างกันอย่างชัดเจน

  1. ยกเลิก staging area (--mixed) เวลาเราใช้ git add ไฟล์จะเข้าไปอยู่ใน staging area แต่บางครั้งเราอาจเพิ่มไฟล์ผิด หรือเปลี่ยนใจไม่อยาก commit แล้ว การใช้ git reset <file> ช่วยให้ไฟล์หลุดออกจาก staging แต่ยังคงการเปลี่ยนแปลงใน working directory อยู่ เช่น
git reset myfile.txt

คำสั่งนี้จะเอาไฟล์ออกจาก staging แต่การเปลี่ยนแปลงยังอยู่ในไฟล์ปัจจุบันของเรา

  1. ย้อนการ commit (--soft) หากเราทำ commit ไปแล้วแต่รู้ตัวว่าต้องแก้ไขอะไรบางอย่างใน commit นั้น เราสามารถย้อน commit ล่าสุดออก แต่ยังเก็บการเปลี่ยนแปลงทั้งหมดไว้ใน staging area ด้วยคำสั่งนี้
git reset --soft HEAD^

การ commit จะถูกลบออก แต่ทุกอย่างในไฟล์ยังเหมือนเดิม เราแค่พร้อมที่จะแก้ไขและ commit ใหม่

  1. ย้อนทุกอย่างกลับไปเหมือน commit เดิม (--hard) นี่คือคำสั่งที่รุนแรงที่สุด หากคุณอยากให้ทุกอย่างในโปรเจกต์กลับไปเหมือน commit เดิม รวมถึงลบการเปลี่ยนแปลงทั้งหมดใน working directory ก็ใช้คำสั่งนี้
git reset --hard HEAD^

การเปลี่ยนแปลงทั้งหมดจะหายไป ไม่มีไฟล์ใดๆ ถูก staging หรือ commit อีกต่อไป ระวังให้ดีเพราะข้อมูลที่ลบด้วย --hard จะไม่สามารถเรียกคืนได้!

ย้อน commit ไปยังจุดใดจุดหนึ่ง

บางครั้งเราอาจอยากย้อนกลับไปยัง commit ที่ทำไปก่อนหน้า คุณสามารถระบุ commit ที่ต้องการย้อนกลับไปได้โดยใช้ commit-hash เช่น

git reset --hard a1b2c3d

เพียงแค่นี้คุณก็จะย้อนกลับไปที่ commit นั้นพร้อมลบการเปลี่ยนแปลงทั้งหมดตั้งแต่ commit นั้นไปแล้ว

สรุป

  • git reset ช่วยให้คุณสามารถจัดการกับ commit, staging area, และการเปลี่ยนแปลงใน working directory ได้อย่างมีประสิทธิภาพ
  • git reset --soft จะย้อน commit แต่เก็บการเปลี่ยนแปลงไว้
  • git reset --mixed ยกเลิก staging แต่ยังคงการเปลี่ยนแปลงใน working directory
  • git reset --hard ลบทุกอย่างออก รวมถึงการเปลี่ยนแปลงใน working directory