Skip to main content

Git Reset และ Git Checkout

Git Reset และ Git Checkout เป็นคำสั่งสำคัญที่ใช้ในการจัดการสถานะของ repository และ branch ใน Git ซึ่งมีความสามารถและการใช้งานที่แตกต่างกัน

1. Git Reset

Git Reset ใช้เพื่อย้ายหัว branch (HEAD) และปรับเปลี่ยน staging area และ/หรือ working directory

1.1 การใช้งาน Git Reset

(1) git reset --soft

ย้าย HEAD โดยไม่เปลี่ยน staging area และ working directory:

git reset --soft <commit>
  • Use case: ยกเลิก commit แต่เก็บการเปลี่ยนแปลงไว้ใน staging area

(2) git reset --mixed (ค่าเริ่มต้น)

ย้าย HEAD และลบการเปลี่ยนแปลงออกจาก staging area แต่ยังคงอยู่ใน working directory:

git reset --mixed <commit>
  • Use case: ยกเลิก commit และนำการเปลี่ยนแปลงกลับมาใน working directory

(3) git reset --hard

ย้าย HEAD และลบการเปลี่ยนแปลงทั้งหมดออกจาก staging area และ working directory:

git reset --hard <commit>
  • Use case: ย้อนกลับไปยังสถานะก่อนหน้าของ commit โดยลบการเปลี่ยนแปลงทั้งหมด

1.2 ตัวอย่างการใช้งาน Git Reset

git log --oneline
# Output
abc123 Commit ล่าสุด
789def Commit ก่อนหน้า
456ghi Commit อีกก่อนหน้า

# ย้อนกลับไปยัง commit `789def`
git reset --mixed 789def

2. Git Checkout

Git Checkout ใช้สำหรับการย้าย HEAD ไปยัง commit หรือ branch ที่ต้องการ และใช้ในการสร้าง branch ใหม่

2.1 การใช้งาน Git Checkout

(1) สลับ branch

git checkout <branch_name>
  • Use case: สลับไปยัง branch ที่มีอยู่

(2) สร้าง branch ใหม่และสลับไปยัง branch นั้น

git checkout -b <new_branch_name>
  • Use case: สร้าง branch ใหม่จากสถานะปัจจุบัน

(3) เช็คเอาท์ไฟล์เฉพาะ

คืนค่าการเปลี่ยนแปลงในไฟล์ที่ระบุ:

git checkout -- <file_name>
  • Use case: คืนค่าไฟล์ใน working directory ให้เหมือนกับใน commit ล่าสุด

2.2 ตัวอย่างการใช้งาน Git Checkout

# สลับไปยัง branch main
git checkout main

# สร้าง branch ใหม่ชื่อ feature/authentication และสลับไปยัง branch นั้น
git checkout -b feature/authentication

# คืนค่าไฟล์ example.txt
git checkout -- example.txt

3. ความแตกต่างระหว่าง Git Reset และ Git Checkout

FeatureGit ResetGit Checkout
การทำงานกับ commitย้าย HEAD ไปยัง commit ที่ระบุสลับไปยัง branch หรือ commit ใหม่
การเปลี่ยน staging areaมีผลต่อ staging area และ working directoryไม่มีผลต่อ staging area
การใช้กับไฟล์ไม่สามารถใช้ได้กับไฟล์เฉพาะเจาะจงใช้คืนค่าไฟล์เฉพาะได้

4. ข้อควรระวัง

  • Git Reset: การใช้ --hard จะลบการเปลี่ยนแปลงทั้งหมดใน working directory
  • Git Checkout: คำสั่ง checkout -- สามารถคืนค่าไฟล์ที่ยังไม่ได้ commit ซึ่งอาจทำให้สูญเสียการเปลี่ยนแปลง

สรุป

Git Reset และ Git Checkout เป็นคำสั่งที่มีความสำคัญและทรงพลัง โดย Reset เหมาะสำหรับการจัดการ commit history และ Checkout เหมาะสำหรับการสลับ branch หรือคืนค่าไฟล์ การเลือกใช้งานคำสั่งนี้ควรพิจารณาอย่างรอบคอบเพื่อหลีกเลี่ยงการสูญเสียข้อมูล