Wednesday, February 02, 2011

git - อยาก commit รวมกับ commit ก่อนหน้านั้น

เรื่องมีอยู่ว่า หลังจากที่ผม commit code ไปเป็นชุด (แก้ feature A แต่พบว่า feature B มี bug ด้วย ก็เลยเกิด commit ไล่ๆกัน)
แล้วเกิดพบว่า ลืม commit file ไปหนึ่ง file
แต่อยากให้ commit นี้ไปรวมอยู่ใน commit ก่อนหน้านั้น
กรณีที่เป็น case พึ่ง commit ไปหยกๆ เราก็สามารถใช้ commit --amend เข้ามาช่วยได้
แต่ถ้าเป็นกรณีที่มี commit อื่นๆมาคั่นหล่ะ

From pphetra


Note: ใช้ได้กับกรณีที่ยังไม่ push ขึ้น repository เท่านั้น

พระเอกของเรื่องนี้ก็คือ git rebase --interaction
ขั้นตอนก็คือ

เนื่องจากเรามี code ที่ต้องการแก้ไข ค้างอยู่ ให้ทำการ stash เก็บไว้ก่อน

$ git stash
Saved working directory and index state WIP on (no branch): b1b2bd6 fix bug: บางครั้งก็กด zoom ผลลัพท์จากการ serach ได้ บางครั้งก็ไม่ได้
HEAD is now at b1b2bd6 fix bug: บางครั้งก็กด zoom ผลลัพท์จากการ serach ได้ บางครั้งก็ไม่ได้


จากนั้นก็สั่ง rebase โดยกำหนด commit id ตัวก่อนหน้าตัวที่เราจะแก้

$ git rebase -i d1b9dc72a4a8f57b1dcb43c704494d8fcb639fd2

pick 516712b ERP-1807 implement login panel.
pick 38d8bda fix bug: duplicate primary key constraint 's name.
pick d316ecd fix bug: บางครั้งก็กด zoom ผลลัพท์จากการ serach ได้ บางครั้งก็ไม่ได้

# Rebase d1b9dc7..d316ecd onto d1b9dc7
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

เลือกเปลี่ยน commit ที่เป็นเป้าหมายในการ amend ให้เป็น 'edit'

จากนั้นก็สั่ง git stash pop
แล้วก็เลือก commit --amend เข้าไป

สุดท้ายก็สั่ง git rebase --continue

Related link from Roti