Commit ผิด Branch แก้ไขอย่างไร? วิธีย้าย Commit ไป Branch ที่ถูกต้อง

# สถานการณ์: Commit ไป Main แทน Feature
Main: C1 -> C2 -> C3 (ผิด: Feature Commit)
Feature: (ไม่มี)

# หลัง Cherry-pick
Main: C1 -> C2
Feature: C3 (ถูกต้อง)

# หลัง Reset
Main: C1 -> C2 (ถูกต้อง)
Feature: C3 (ถูกต้อง)

ป้องกัน Mistakes

  • ตรวจสอบ Current Branch ก่อน Commit
  • ใช้ Git Hooks เตือน Branch
  • ใช้ Meaningful Branch Names
# ตรวจสอบ Current Branch
git branch -v

# ตรวจสอบ Status
git status

การแก้ไข Commit ผิด Branch ไม่ยาก แต่ป้องกันไว้ล่วงหน้าจะดีกว่า

Step-by-Step Example

# สถานการณ์: Commit ไป Main แทน Feature
Main: C1 -> C2 -> C3 (ผิด: Feature Commit)
Feature: (ไม่มี)

# ขั้นตอนที่ 1: ดูประวัติ Log
git log --oneline

# ขั้นตอนที่ 2: ใช้ Cherry-pick หรือ Reset
# วิธีที่ 1: Cherry-pick (copy C3 ไป Feature)
# วิธีที่ 2: Reset Main กลับไป C2
# จากนั้น Switch ไป Feature และ Cherry-pick หรือ Apply

# หลัง Cherry-pick
Main: C1 -> C2
Feature: C3 (ถูกต้อง)

# หลัง Reset
Main: C1 -> C2 (ถูกต้อง)
Feature: C3 (ถูกต้อง)

วิธีที่ 1: Cherry-pick Approach

# Step 1: ดูว่า Commit ไหน
git log --oneline Main

# Step 2: Switch ไป Feature
git switch feature-branch

# Step 3: Cherry-pick Commit ที่ผิด
git cherry-pick <commit-id-of-C3>

# Step 4: Switch กลับ Main และ Reset
git switch main
git reset --hard HEAD~1

# ผลลัพธ์:
# Main: C1 -> C2
# Feature: C3

วิธีที่ 2: Reset + Switch Approach

# Step 1: ดูประวัติ
git log --oneline

# Step 2: Reset Main กลับหนึ่งขั้น
git reset --hard HEAD~1
# Main กลับมาเป็น C1 -> C2

# Step 3: สร้าง Stash หรือ Branch สำหรับ C3
git switch feature-branch
git cherry-pick origin/main@{1}  # Pick C3 ที่หลุด
# หรือ
git merge origin/main  # Merge C3 เข้ามา

# ผลลัพธ์:
# Main: C1 -> C2
# Feature: C3

Common Scenario

# สถานการณ์จริง: Commit ไป Main โดยไม่ตั้งใจ
$ git log --oneline
c3a2b1f Add feature X (ผิด: ควรไป feature-X branch)
a2b1c0f Fix bug in login
1a2b3c0f Initial commit

# วิธีแก้ 1: Cherry-pick
$ git switch feature-X
$ git cherry-pick c3a2b1f
$ git switch main
$ git reset --hard a2b1c0f

# วิธีแก้ 2: Reset + Apply
$ git reset --hard a2b1c0f
$ git switch feature-X
$ git cherry-pick origin/main@{1}

# ตรวจสอบ
$ git log --oneline
main: a2b1c0f Fix bug in login
feature-X: c3a2b1f Add feature X