การหยิบยืม commit จากคนอื่นใน github (cherry-pick)

การหยิบยืม commit จากคนอื่นใน github (cherry-pick)

credit : http://pilpag.blogspot.com/2016/04/cherry-pick-what-amazing-command.html

การทำ Cherry-pick ใน git อาจจะเป็นเรื่องที่หลายๆคนไม่รู้จัก หรือไม่ค่อยได้ใช้ แต่ประโยชน์ของมันค่อนข้างเยอะ อย่างเช่น ใช้ในการ update code ของผู้อื่นที่เป็น contributor เข้า project ของเราโดยที่ไม่ต้อง copy/ paste code ซึ่งมีโอกาสผิดพลาดได้

ตัวอย่างการใช้ cherry-pick

Credit : https://www.farreachinc.com/blog/far-reach/2017/03/16/git-cherry-pick-why-and-how

จากตัวอย่าง Node H คือ code ล่าสุดของ Production ส่วนของนักพัฒนาจะเป็น code ที่กำลังพัฒนา

สมมติไปเจอ code ของคนอื่น(Node I) โดยปกติแล้วหากต้องการใช้ code ส่วนนี้ จะต้องทำการ copy มาวางที่ code ของเรา ซึ่งมีโอกาส copy ได้ไม่ครบ หาก I มีการแก้ไขเยอะ ทำให้ระบบ error หรือเกิด bug ได้ ฉะนั้นวิธีการแก้คือการใช้ cherry-pick จาก I เข้าสู่ C โดยที่จะมั่นใจได้ว่า C จะมี code ที่ copy มาจาก I + code ที่แก้ไขใน D

วิธีการใช้งาน จากตัวอย่างการ Migration Source Code OCA
สมมติว่าเรากำลัง Migration Module hr_calendar_rest_time จาก version 12 ไป version 13
pr : https://github.com/OCA/hr/tree/12.0/hr_calendar_rest_time

แต่มีคนแก้ไข bug บางอย่างใน version 12 และยังไม่ถูก merge เข้า master
pr : https://github.com/OCA/hr/pull/803

วิธีแก้โดยปกติแล้วก็คงใช้การ copy/paste code ที่มีการแก้ไขเข้า code ของเราโดยตรงเลย แต่ปัญหาที่จะเกิดขึ้นตามมาคือ ใน version 13 จะไม่มี commit ของคนที่แก้ไข code นี้
โดย commit ที่ควรจะเป็นควรจะเป็นอย่างนี้
[12.0][MIG] hr_calendar_rest_time    –> version 12 ก่อนแก้ไข
[12.0][FIX] hr_calendar_rest_time     –> version 12 แก้ไขบัค
[13.0][MIG] hr_calendar_rest_time    –> version 13

แต่ถ้าเรา copy/paste code ของเขามาวางใน version 13 ของเราเลยจะกลายเป็นแบบนี้
[12.0][MIG] hr_calendar_rest_time    –> version 12 ก่อนแก้ไข
[13.0][MIG] hr_calendar_rest_time    –> version 13 (แก้ไขแล้วแต่ไม่มี commit แก้ไข)

และเราไม่สามารถใช้ git pull ได้ เพราะว่า code ที่แก้ไขยังไม่ถูก merge เข้า master
ฉะนั้นวิธีแก้ไขสำหรับกรณีนี้คือการใช้ cherry-pick commit [12.0][FIX] hr_calendar_rest_time มาใส่ใน code ของเราที่เป็น version 13 โดยมีขั้นตอนดังนี้

  1. ทำการ migration code ขึ้น version 13 ตามปกติก่อน จะได้ commit ดังนี้
    [12.0][MIG] hr_calendar_rest_time    –> version 12
    [13.0][MIG] hr_calendar_rest_time    –> version 13
  2. เมื่อพบเจอการแก้บัคที่ version 12 แต่ยังไม่ถูก merge เข้า master ให้ remote ไปที่ branch ของเจ้าของก่อน แล้วใช้ fetch เพื่อ update branch ให้เป็นล่าสุด
    # git remote add <name> <url git> (git remote add tegin https://github.com/tegin/hr.git)
    # git fetch <name> (git fetch tegin)
  3. เลือก commit ที่ต้องการใช้ และ copy หมายเลข commit
  4. # git cherry-pick <name>/<commit>
    (git cherry-pick tegin/0fb171f2c2b3cb96de6d566b377032dd4a17df46)
    เพียงเท่านี้ ระบบก็จะไป copy code จาก commit ที่เราเลือกมาใส่ใน branch ของเราเรียบร้อย โดยจะมีการเรียงลำดับดังนี้
    [12.0][MIG] hr_calendar_rest_time    –> version 12
    [13.0][MIG] hr_calendar_rest_time    –> version 13
    [12.0][FIX] hr_calendar_rest_time     –> cherry-pick

    หากต้องการให้เรียงสวยงามจะต้องทำการ cherry-pick ก่อนแก้ไข version 13

กรณีที่ใช้ cherry-pick แล้วเกิด conflict file ให้แก้ไขก่อนแล้วใช้คำสั่ง
# git cherry-pick –continue
ถ้ายัง conflict file ให้แก้ไขเหมือนเดิมแล้วใช้คำสั่งวนไปเรื่อยๆ สาเหตุเกิดจาก code บางส่วนที่ cherry-pick มากับที่เราแก้ไขมีการ conflict กัน
https://ecosoft-odoo.blogspot.com/2020/03/commit-github-cherry-pick.html
About the Author

Leave a Reply