วิธีง่ายๆ ในการกรุ๊ปรวมคอมมิทหลายๆ ตัวให้เป็นตัวเดียว และยังสามารถทำได้แม้ในกรณีที่เรา push คอมมิทเหล่านั้นขึ้นไปยัง git server เรียบร้อยแล้วด้วย
Git สามารถที่จะกรุ๊ปรวมคอมมิทให้กลายเป็นคอมมิทเดียวได้ด้วยคำสั่ง git rebase --interactive HEAD~[N]
หรือสั้นๆ git rebase -i HEAD~[N]
โดยที่ [N] คือจำนนวนคอมมิทก่อนหน้านี้
อธิบายเพิ่มเติมในส่วนของ HEAD~[N]
ยกตัวอย่างง่ายๆ ในกรณีที่ตอนนี้เราอยู่ที่คอมมิทล่าสุด และถ้าหากเราต้องการกรุ๊ปรวมคอมมิทก่อนหน้านี้ 3 คอมมิท เราสามารถที่จะเพิ่มอาร์กิวเมนต์ต่อท้าย git rebase -i
เพื่อที่จะนำคอมมิทก่อนหน้านี้มา 3 ตัวเพื่อนำมากรุ๊ปรวมให้เป็นคอมมิทเดียว ซึ่งเราสามารถเพิ่มอากิวเมนต์ได้โดยเพิ่มคำสั่ง HEAD~4
ต่อท้าย แต่เมื่อนับรวมกับคอมมิทล่าสุดของเราด้วยแล้วก็จะกลายเป็นว่าเราจะมีคอมมิทที่จะนำไปแก้ไขทั้งหมด 4 ตัว เพื่อให้เข้าใจได้ง่ายขึ้นเดี๋ยวเรามาลองดูโค้ดตัวอย่างกัน
ขั้นตอน 👩🏫
ก่อนที่เราจะทำ rebase
เรามาดูคอมมิทที่เรามีกันก่อน เราสามารถเช็คคอมมิทได้จากหน้าต่างเครื่องมือช่วยอย่าง Sourcetree หรือจะใช้ command line อย่าง git log
commit 1e3399... (HEAD -> master, origin/master)
Author: Atthaphon Urairat <xxx@xxxxx.com>
Date: Wed Jun 26 09:27:07 2019 +0700
Completed B
commit 729dad...
Author: Atthaphon Urairat <xxx@xxxxx.com>
Date: Wed Jun 26 09:21:11 2019 +0700
add more option for header
commit f7375b...
Author: Atthaphon Urairat <xxx@xxxxx.com>
Date: Wed Jun 26 09:06:29 2019 +0700
disable cache
commit 256bbc...
Author: Atthaphon Urairat <xxx@xxxxx.com>
Date: Wed Jun 26 08:54:46 2019 +0700
corrected method
commit f62f5f...
Author: Atthaphon Urairat <xxx@xxxxx.com>
Date: Tue Jun 25 18:42:33 2019 +0700
Completed A
...
หรือถ้าหากว่าเราต้องการดู log แต่ละคอมมิทในบรรทัดเดียว เราก็สามารถเพิ่มอาร์กิวเมนต์ git log --pretty=oneline
1e3399... (HEAD -> master, origin/master) Completed B <<< คอมมิทล่าสุด
729dad... add more option for header
f7375b... disable cache
256bbc... corrected method
f62f5f... Completed A <<< คอมมิทเก่ากว่า
...
จากตัวอย่างข้างต้น ตอนนี้เราอยู่ที่คอมมิทแรก 1e3399... (HEAD -> master, origin/master) Completed B
และต้องการที่จะกรุ๊ปคอมมิทก่อนหน้านี้สามตัวถึงคอมมิทที่ชื่อ
256bbc... corrected method
ผลลัพธ์ที่เราคาดหวังไว้คือการกรุ๊ปรวมคอมมิทให้เป็นดังนี้
1e3399... (HEAD -> master, origin/master) Completed B
f62f5f... Completed A
...
นั่นคือการกรุ๊ปรวมคอมมิททั้งหมดที่อยู่ระหว่าง Completed B และ Completed A ให้เหลือเพียงคอมมิทดังตัวอย่างก่อนหน้านี้ ต่อไปเราก็มารันคำสั่งกันเลย
git rebase -i HEAD~4
คำเตือน เมื่อเรารันคำสั่งไปแล้ว ต่อจากนั้นหน้าจอก็จะเปลี่ยนเป็นตัว editor เพื่อโชว์คอมมิทที่เราต้องการจะทำการกรุ๊ปรวม แต่!! มันจะถูกแสดงออกมาในลำดับการจัดเรียงกลับหลัง ซึ่งต่างจากการรันคำสั่ง git log
ของเราก่อนหน้านี้
TIP 💡 ในกรณีที่เรามีคอมมิทที่ต้องการจะกรุ๊ปรวมเยอะ และการนับคอมมิทเพื่อเอาเลขมาใส่ท้าย
HEAD~
มีความยุ่งยากหรืออาจเกิดข้อผิดพลาดได้ง่าย เราก็สามารถที่จะใช้เลขคอมมิทแทนการใช้HEAD~[N]
ได้ดังนี้git rebase -i [commit-number]
git rebase -i f62f5fd
ผลลัพธ์ของการรันทั้งสองคำสั่งก็จะได้ค่าออกมาเหมือนกันดังที่แสดงในตัวอย่างด้านล่างนี้
pick f62f5fd corrected method <<< คอมมิทเก่ากว่า
pick f7375bf disable cache
pick 729dad4 add more option for header
pick 1e3399c Completed B <<< คอมมิทล่าสุด
# Rebase f62f5fd..1e3399c onto f62f5fd (3 commands)
จากนั้นเราก็ทำการ เปลี่ยน pick
เป็น squash
หรือสามารถเขียนสั้นๆ s
ก็ได้เพื่อทำการกรุ๊ปรวมคอมมิทจากเก่าสุดเพื่อให้รวมกับคอมมมิทล่าสุด
pick f62f5fd corrected method <<< คอมมิทเก่ากว่า
s f7375bf disable cache
s 729dad4 add more option for header
s 1e3399c Completed B <<< คอมมิทล่าสุด
# Rebase f62f5fd..1e3399c onto f62f5fd (4 commands)
จากนั้นเมื่อเราทำการเซฟไฟล์แล้ว editor ก็จะพาเราไปอีกหน้าซึ่งเป็นหน้าสำหรับ commit msg ใหม่ แต่จะมีข้อความเริ่มต้นให้เราแบบด้านล่างนี้ แต่เราสามารถลบและใส่ข้อความใหม่ได้ หรือจะใช้ข้อความที่มีมาให้ก็ได้
# This is a combination of 3 commits.
# This is the 1st commit message:
corrected method
# This is the 1st commit message #2:
disable cache
# This is the 1st commit message #3:
add more option for header
# This is the 1st commit message #4:
Completed B
...
ผมจะทำการลบข้อความทั้งหมดให้เหลือเพียงคำว่า Completed B
Complete B
หลังจากทำการเซฟและออกจาก editor แล้วก็จะปรากฏข้อความแสดงความยินดี ซึ่งแสดงว่าเราทำการรวมคอมมิทให้กลายเป็นคอมมิทเดียวได้สำเร็จแล้ว 🥳🥳 ❤️🎉 (หรืออาจเป็นข้อความ ตอกย้ำก็ได้ในกรณีที่เราทำผิดพลาด 😫😫)
[detached HEAD 1bc71e4] Completed B
Date: Wed Jun 26 08:54:46 2019 +0700
4 files changed, 11 insertions(+), 21 deletions(-)
Successfully rebased and updated refs/heads/master
จากนั้นเราก็จะได้ คอมมิทใหม่มาซึ่งกรุ๊ปรวมคอมมิททั้งหมดที่เราได้ทำไปก่อนหน้านี้มาเป็นที่เรียบร้อยแล้ว
สุดท้ายนี้ ก็ทำการ push ขึ้นไปยัง git server ของเราอีกครั้งแบบ force push ด้วยคำสี่ง git push origin master --force
เตือน ❗️ ตั้งสติก่อนสตาร์ท เอ้ย!! โทด โทด ตั้งสติก่อน push ครับ 🤣🤣 เพราะการทำ force push มันถือว่าเป็นความเสี่ยง ดังนั้นเราควรแน่ใจกับ commit ของเรา หรืออาจสร้าง branch ไว้เป็น backup ก่อน ทำการ force push ไว้ดีกว่าครับ
วันนี้จบแล้วครับ ขอบคุณที่ติดตามอ่านจนจบครับ หวังว่าจะเป็นประโยชน์กับใครบ้างสักคนบ้างนะครับ
Top comments (1)
ขอบคุณครับ