Cherry-pick ใน Git คืออะไร? วิธีเลือก Commit มาใช้

Git cherry-pick คือคำสั่งที่ช่วยให้คุณเลือก commit เฉพาะจาก branch หนึ่ง แล้วนำมาใช้ใน branch อื่น โดยไม่ต้อง merge ทั้ง branch มา เป็นเครื่องมือที่มีประโยชน์มากสำหรับการแก้บั๊กเฉพาะจุดหรือการนำคุณสมบัติบางอย่างจาก branch หนึ่งไปอีก branch บทความนี้จะสอนวิธีใช้ cherry-pick อย่างถูกต้องและกรณีที่เหมาะสมต่อการใช้งาน

git cherry-pick คืออะไร?

cherry-pick คือการเลือกเชร่ี เปรียบเหมือนการเด็ดเชร่ีที่ต้องการออกจากหลายลูกในสวน ใน Git การ cherry-pick commit หมายความว่าเราเอา commit เฉพาะที่เราต้องการจากอีก branch มาใช้ใน branch ปัจจุบัน สร้าง commit ใหม่ที่มีการเปลี่ยนแปลงแบบเดียวกับต้นฉบับ

ความแตกต่างจาก merge คือ cherry-pick จะดึงเพียง commit เฉพาะอย่าง ส่วน merge จะดึง commit ทั้งหมดตั้งแต่ point diverge เป็นต้นไป

วิธีใช้ git cherry-pick

ค้นหา commit hash ที่ต้องการ

# ดู log ของ branch ที่มี commit ที่ต้องการ
git log feature/fix-bug --oneline

# ตัวอย่างผลลัพธ์:
# a1b2c3d Fix: แก้ปัญหา login session
# e4f5g6h Add: เพิ่มฟีเจอร์ login
# i7j8k9l Initial commit
# .....

เลือก commit เข้ามาใน branch ปัจจุบัน

# อยู่บน main branch
git checkout main

# cherry-pick commit เดียว
git cherry-pick a1b2c3d

# cherry-pick หลาย commit พร้อมกัน
git cherry-pick a1b2c3d e4f5g6h

# cherry-pick ช่วงของ commits (A..B ไม่รวม A, A^..B รวม A)
git cherry-pick a1b2c3d^..e4f5g6h

กรณีที่ใช้ Cherry-pick จริง

1. นำ Bug Fix จาก develop ไป release branch

เมื่อแก้บั๊กใน develop branch แล้ว แต่ release branch ยังมีบั๊กเดียวกัน สามารถนำเฉพาะ fix commit ไปได้เลย โดยไม่ต้อง merge ทั้ง develop ซึ่งอาจมี feature ใหม่ที่ยังไม่พร้อม release

git checkout release/2.0
git cherry-pick a1b2c3d  # commit ที่แก้บั๊ก

2. นำ Feature บางส่วนไปใช้ในอีก Branch

เมื่อต้องการเพียงฟังก์ชันใดหนึ่งจากอีก feature branch โดยไม่เอาเนื้อหาทั้งหมด ซึ่งเป็นวิธีควบคุม feature delivery ได้อย่างละเอียด

3. กู้ commit ที่ลบไปโดยไม่ตั้งใจ

ถ้า commit ถูกลบหรือหายไปจาก branch ที่ถูกลบ สามารถใช้ cherry-pick เพื่อนำ commit นั้นกลับมาได้ โดยใช้ git reflog เพื่อค้นหา commit hash ก่อน

แก้ไข Cherry-pick Conflict

Cherry-pick อาจเกิด conflict ได้เหมือนกัน วิธีแก้คือ:

# แก้ไข conflict ในไฟล์
# เปิดไฟล์ที่ขัดแย้ง และเลือกว่าจะเก็บส่วนไหน

# stage ไฟล์ที่แก้ไขเรียบร้อยแล้ว
git add .

# ดำเนินการ cherry-pick ต่อ
git cherry-pick --continue

# หรือยกเลิก cherry-pick
git cherry-pick --abort

Options ที่มีประโยชน์

# cherry-pick โดยไม่สร้าง commit ทันที (เพิ่มไป staging)
git cherry-pick -n a1b2c3d

# cherry-pick และเปลี่ยน commit message
git cherry-pick -e a1b2c3d

# cherry-pick พร้อมเก็บข้อมูลว่ามาจากไหน
git cherry-pick -x a1b2c3d

# cherry-pick แล้ว edit message ก่อนสร้าง commit
git cherry-pick -X our a1b2c3d  # choose our changes on conflict

ข้อควรระวังในการใช้ Cherry-pick

  • อย่าใช้บ่อยเกินไป เพราะจะทำให้ history ซับซ้อน
  • cherry-pick สร้าง commit ใหม่ (hash ใหม่) ที่มีเนื้อหาเดียวกันกับต้นฉบับ
  • ถ้าต้องการ commit หลายอัน อาจควรใช้ merge แทน
  • commit ที่ cherry-pick ควรมีความหมายในตัวเอง (self-contained) ไม่พึ่งพิง commit อื่น
  • หลีกเลี่ยง cherry-pick โดยตรงจาก main ไป develop เพราะจะทำให้ history ไม่สอดคล้องกัน

การแก้ไข Commit ที่ผิดพลาด

ในบางครั้ง cherry-pick ไม่ใช่วิธีที่ดีที่สุด ตัวอย่างเช่น ถ้า commit ถูก push ไปยัง branch ผิด อาจใช้วิธีอื่นได้ดีกว่า เช่น git revert สำหรับการยกเลิก commit ที่ผิด หรือ วิธีแก้ไข commit ที่ push ไปบน branch ผิด

กู้คืน Cherry-pick ล้มเหลว

ถ้า cherry-pick ไม่สำเร็จ หรือต้องการย้อนกลับไปดูว่า commit ไหนถูก cherry-pick มาแล้ว สามารถใช้ git reflog เพื่อติดตามประวัติการเปลี่ยนแปลง ได้

สรุป

Git cherry-pick เป็นเครื่องมือที่แม่นยำเมื่อต้องการ commit เฉพาะจุดจากอีก branch โดยเฉพาะ การใช้ที่ถูกต้องคือการนำ bug fix จาก branch หนึ่งไปยังอีก branch โดยไม่เอาการเปลี่ยนแปลงทั้งหมดมา ควรใช้อย่างระมัดระวังและใช้เฉพาะกรณีที่จำเป็นจริงๆ เพื่อให้ git history ไม่ซับซ้อนโดยไม่จำเป็น ด้วยความเข้าใจที่ถูกต้องเกี่ยวกับ cherry-pick คุณสามารถจัดการ branch strategy ของ ผู้ให้บริการโฮสติ้ง Cloud Hosting หรือ VPS ได้อย่างมืออาชีพ