การยกเลิกการเปลี่ยนแปลงและการจัดการประวัติใน 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
- ใช้คำสั่ง
git rebase -iเพื่อเริ่มการปรับประวัติ commit
git rebase -i HEAD~n
โดยที่ n คือจำนวน commit ที่คุณต้องการดูย้อนหลัง ตัวอย่างเช่น HEAD~3 จะดู 3 commit ก่อนหน้า
-
Git จะเปิด editor ให้คุณเลือก commit ที่ต้องการเปลี่ยนแปลง
-
คุณสามารถเปลี่ยนคำสั่งจาก
pickเป็นdropเพื่อทำการลบ commit หรือeditเพื่อทำการแก้ไข commit นั้น -
เมื่อเสร็จสิ้นการแก้ไขแล้ว ให้บันทึกและออกจาก editor
-
Git จะทำการ rebase และปรับประวัติ commit ตามที่คุณเลือก
ข้อควรระวัง: การใช้ rebase เพื่อแก้ไขประวัติ commit สามารถทำให้ประวัติ commit เปลี่ยนแปลงไป ซึ่งอาจส่งผลกระทบต่อการทำงานร่วมกันในโปรเจกต์ที่มีหลายคนร่วมพัฒนา
6. การจัดการ Branches
เมื่อคุณทำการย้อนกลับ commit หรือปรับประวัติ commit แล้ว คุณอาจต้องการจัดการกับ branches ด้วยคำสั่งต่างๆ เช่น:
git branch– ดูรายชื่อ branch ใน repositorygit checkout– เปลี่ยนไปยัง branch อื่นgit merge– รวมการเปลี่ยนแปลงจาก branch หนึ่งเข้ามาใน branch ปัจจุบันgit branch -d <branch-name>– ลบ branch ที่ไม่ต้องการ
สรุป
การยกเลิกการเปลี่ยนแปลงและการจัดการประวัติการทำงานใน Git เป็นเครื่องมือที่สำคัญที่ช่วยให้คุณสามารถกลับไปยังสถานะก่อนหน้า, ยกเลิกการเปลี่ยนแปลงที่ไม่ต้องการ, หรือจัดการประวัติ commit ได้อย่างมีประสิทธิภาพและยืดหยุ่น