Skip to main content

การยกเลิกการเปลี่ยนแปลงและการจัดการประวัติใน Git

บทนำ

การยกเลิกการเปลี่ยนแปลงและการจัดการประวัติเป็นส่วนสำคัญในการทำงานกับ Git เนื่องจากช่วยให้คุณสามารถย้อนกลับไปยังสถานะก่อนหน้า, ยกเลิกการเปลี่ยนแปลงที่ไม่ต้องการ หรือแม้กระทั่งลบ commit ที่ไม่ต้องการออกจากประวัติการทำงาน

ในบทนี้เราจะเรียนรู้วิธีการใช้คำสั่งใน Git เพื่อยกเลิกการเปลี่ยนแปลงและการจัดการประวัติใน repository ของเรา

1. ยกเลิกการเปลี่ยนแปลงในไฟล์ที่ยังไม่ได้ commit

หากคุณทำการแก้ไขไฟล์ใน working directory แต่ยังไม่ได้ commit การเปลี่ยนแปลงเหล่านั้น คุณสามารถยกเลิกการเปลี่ยนแปลงได้หลายวิธี:

1.1 ใช้ git restore

หากคุณต้องการยกเลิกการเปลี่ยนแปลงในไฟล์ที่ยังไม่ได้ commit, คุณสามารถใช้คำสั่ง git restore ดังนี้:

git restore <filename>

ตัวอย่าง:

git restore index.js

คำสั่งนี้จะยกเลิกการเปลี่ยนแปลงในไฟล์ index.js และคืนค่ามันกลับไปยังสถานะของไฟล์ใน commit ล่าสุด

1.2 ยกเลิกการเปลี่ยนแปลงทั้งหมดใน working directory

หากคุณต้องการยกเลิกการเปลี่ยนแปลงทั้งหมดใน working directory, สามารถใช้คำสั่งนี้:

git restore .

2. ยกเลิกการเพิ่มไฟล์ใน Staging Area

หากคุณได้เพิ่มไฟล์ไปยัง staging area (ด้วยคำสั่ง git add) แต่ยังไม่ได้ commit และต้องการยกเลิกการเพิ่มไฟล์เหล่านั้น, ใช้คำสั่ง:

git restore --staged <filename>

ตัวอย่าง:

git restore --staged index.js

คำสั่งนี้จะยกเลิกการเพิ่มไฟล์ index.js ใน staging area แต่จะไม่ลบการเปลี่ยนแปลงใน working directory

3. ย้อนกลับไปยัง Commit ก่อนหน้า

หากคุณต้องการย้อนกลับไปยัง commit ก่อนหน้า (หรือ commit ที่เก่ากว่า), คุณสามารถใช้คำสั่ง git reset ดังนี้:

3.1 ย้อนกลับไปยัง commit ก่อนหน้า โดยไม่เปลี่ยนแปลงไฟล์

หากคุณต้องการย้อนกลับไปยัง commit ก่อนหน้า โดยที่ไฟล์ใน working directory และ staging area จะไม่ถูกเปลี่ยนแปลง (การเปลี่ยนแปลงในไฟล์จะยังคงอยู่):

git reset --soft HEAD~1

คำสั่งนี้จะทำให้ HEAD ชี้ไปยัง commit ก่อนหน้า แต่ไฟล์ใน working directory จะยังคงอยู่เหมือนเดิม

3.2 ย้อนกลับไปยัง commit ก่อนหน้า และยกเลิกการเปลี่ยนแปลงใน staging area

หากคุณต้องการย้อนกลับไปยัง commit ก่อนหน้า และยกเลิกการเปลี่ยนแปลงใน staging area:

git reset --mixed HEAD~1

3.3 ย้อนกลับไปยัง commit ก่อนหน้า และยกเลิกการเปลี่ยนแปลงในทั้ง staging area และ working directory

หากคุณต้องการย้อนกลับไปยัง commit ก่อนหน้า และยกเลิกการเปลี่ยนแปลงทั้งหมด (ทั้งใน staging area และ working directory):

git reset --hard HEAD~1

ข้อควรระวัง: การใช้ --hard จะลบการเปลี่ยนแปลงทั้งหมดใน working directory และ staging area ซึ่งไม่สามารถกู้คืนได้

4. การ Revert Commit

หากคุณต้องการยกเลิก commit ที่ได้ทำไปแล้ว แต่ยังต้องการให้ประวัติการทำงานถูกเก็บไว้ใน Git history (ไม่ลบ commit นั้นออกจากประวัติการทำงาน), คุณสามารถใช้คำสั่ง git revert ดังนี้:

git revert <commit-hash>

คำสั่งนี้จะสร้าง commit ใหม่ที่ย้อนกลับการเปลี่ยนแปลงที่เกิดจาก commit ที่ระบุ

ตัวอย่าง:

git revert 1a2b3c4d

คำสั่งนี้จะย้อนกลับการเปลี่ยนแปลงที่ทำใน commit 1a2b3c4d โดยไม่ลบ commit นั้นออกจากประวัติการทำงาน

5. การลบ Commit จาก History (การใช้ git rebase)

หากคุณต้องการลบ commit ที่ไม่ต้องการออกจากประวัติการทำงานโดยสมบูรณ์ (ไม่แค่การย้อนกลับการเปลี่ยนแปลง), คุณสามารถใช้ git rebase เพื่อปรับประวัติ commit

5.1 การใช้ Interactive Rebase

  1. ใช้คำสั่ง git rebase -i เพื่อเริ่มการปรับประวัติ commit
git rebase -i HEAD~n

โดยที่ n คือจำนวน commit ที่คุณต้องการดูย้อนหลัง ตัวอย่างเช่น HEAD~3 จะดู 3 commit ก่อนหน้า

  1. Git จะเปิด editor ให้คุณเลือก commit ที่ต้องการเปลี่ยนแปลง

  2. คุณสามารถเปลี่ยนคำสั่งจาก pick เป็น drop เพื่อทำการลบ commit หรือ edit เพื่อทำการแก้ไข commit นั้น

  3. เมื่อเสร็จสิ้นการแก้ไขแล้ว ให้บันทึกและออกจาก editor

  4. Git จะทำการ rebase และปรับประวัติ commit ตามที่คุณเลือก

ข้อควรระวัง: การใช้ rebase เพื่อแก้ไขประวัติ commit สามารถทำให้ประวัติ commit เปลี่ยนแปลงไป ซึ่งอาจส่งผลกระทบต่อการทำงานร่วมกันในโปรเจกต์ที่มีหลายคนร่วมพัฒนา

6. การจัดการ Branches

เมื่อคุณทำการย้อนกลับ commit หรือปรับประวัติ commit แล้ว คุณอาจต้องการจัดการกับ branches ด้วยคำสั่งต่างๆ เช่น:

  • git branch – ดูรายชื่อ branch ใน repository
  • git checkout – เปลี่ยนไปยัง branch อื่น
  • git merge – รวมการเปลี่ยนแปลงจาก branch หนึ่งเข้ามาใน branch ปัจจุบัน
  • git branch -d <branch-name> – ลบ branch ที่ไม่ต้องการ

สรุป

การยกเลิกการเปลี่ยนแปลงและการจัดการประวัติการทำงานใน Git เป็นเครื่องมือที่สำคัญที่ช่วยให้คุณสามารถกลับไปยังสถานะก่อนหน้า, ยกเลิกการเปลี่ยนแปลงที่ไม่ต้องการ, หรือจัดการประวัติ commit ได้อย่างมีประสิทธิภาพและยืดหยุ่น