DEV Community

Cover image for จะทำยังไงดีน้าาาา.. อยากแก้คำผิดใน commit message ที่ผ่านๆ มา
Gatuk S. Chattanon for PRODIGY9

Posted on

จะทำยังไงดีน้าาาา.. อยากแก้คำผิดใน commit message ที่ผ่านๆ มา

เคยไหม... ในวันที่เราต้องแก้โค้ดอะไรสักอย่างหนึ่งในวันที่เร่งรีบ แล้วเผลอ commit message อย่างรัว จนทำให้พิมพ์อะไรผิดไปสักอย่างหนึ่ง

เคยไหม... ในวันที่เรามีไฟสุดๆ ตื่นเช้ามาเขียนโค้ด แล้ว commit code อย่างรัว ยังกับตัวเองเป็น hacker ยังไงยังงั้น แต่กลับมาเจอว่า แย่แล้ว! เราเขียน commit message หลายอันผิดไป!

หลายคนอาจจะเคย และหลายคนอาจจะไม่เคย แต่ถ้าหากเคยเป็น เราก็มี choice แค่ไม่กี่อย่าง นั่นก็คือ ทิ้งมันไว้ตรงนั้นแหละ 🥲 กับอีกอย่างคือ ขอกลับไปแก้หน่อยน่าา 🤔

ถ้าหากเราเลือก choice "ขอกลับไปแก้หน่อยน่าา" นั่นแปลว่า blog นี้จะเป็นประโยชน์กับทุกคนที่ผ่านมาอ่านแน่ๆ 555 (เราเชื่อว่าแบบนั้น 😌)

ดังนั้น เราจะพาทุกคนไปทำความรู้จักกับ git interactive rebase mode สำหรับการแก้ไข commit message หลายๆ อันในอดีต

เราขอสมมติเหตุการณ์ กันเลยดีกว่า สมมติว่าเราสร้าง branch ใหม่ขึ้นมาชื่อว่า branch feature/user_login ไว้สำหรับการ login ของ user เข้าสู่ระบบ ซึ่งแน่นอนว่า การ login นั้น จะมี task หลายๆ task เกิดขึ้นมา โดยเราจะขอ commit 1 ครั้งเมื่อ task 1 task เสร็จเรียบร้อย และใช้งานได้ โดย commit message ที่เกิดขึ้น จะมี 4 อัน ดังนี้

commit ff6c9f5ac37d77bbe084a7f8cc0d5a34c96d89e4 (HEAD -> feature/login_user)
Author: Gatuk Chattanon <gatukgl@gmail.com>
Date:   Sat Oct 2 15:35:33 2021 +0700

    Login user to system when user is valid

commit b9c3458ff62d400f54005927c832cee063a3d682
Author: Gatuk Chattanon <gatukgl@gmail.com>
Date:   Sat Oct 2 15:35:16 2021 +0700

    Validate psw

commit c6cda7e462eba06b65fac5d5e176f10a06652eed
Author: Gatuk Chattanon <gatukgl@gmail.com>
Date:   Sat Oct 2 15:34:53 2021 +0700

    Validate email

commit d519a517e3c8b2967ffae6155f906ccea95af7fb
Author: Gatuk Chattanon <gatukgl@gmail.com>
Date:   Sat Oct 2 15:34:07 2021 +0700

    crate login form
Enter fullscreen mode Exit fullscreen mode

จะเห็นได้ว่า ด้วยความรีบหรืออะไรก็ตาม ทำให้เราพิมพ์ commit message ผิดๆ ถูกๆ เห็นแล้วขัดใจเพื่อนร่วมทีมแน่ๆ review โค้ดกันที หรือกลับมาอ่าน commit อีกทีทีหลัง น่าจะปวดใจมากๆ เพราะฉะนั้นเรามาลองแก้ไขให้ถูกกัน โดยใช้ git interactive rebase นั่นเองจ้า!

$ git rebase -i HEAD~<number_of_commits> 
// หรือ
$ git rebase -i @~<number_of_commits>
Enter fullscreen mode Exit fullscreen mode

ซึ่ง number_of_commits ด้านบนนั้น หมายถึง จำนวน commit message ที่เราต้องการจะย้อนไปเริ่มแก้ไข โดยใน branch feature/login_user นั้น เราได้สร้าง commit message ขึ้นมาทั้งหมด 4 อัน และอยากจะย้อนกลับไปแก้ไข ตั้งแต่ commit เริ่มต้นเลย ซึ่งก็ย้อนไป 4 อันนั่นเอง เพราะฉะนั้นเราจะต้องใช้ command ด้านล่างนี้

$ git rebase -i @~4
Enter fullscreen mode Exit fullscreen mode

หลังจากนั้น ก็ต้องใช้ทักษะ ความเชี่ยวชาญชำนาญด้าน vim เล็กน้อย ถึงปานกลาง 5555 เพราะว่าเมื่อเข้าสู่ interactive mode น้อง terminal ก็จะเปิด vim editor ขึ้นมาให้เรานั่นเองเป็นอัตโนมัติ ซึ่งก็จะมี commit message ต่างๆ เหล่านี้ขึ้นมา (อันนี้ใครที่ไม่ค่อยถนัดใช้ vim เรามีวิธีการเปลี่ยนให้ terminal ไปเปิด editor ตัวอื่นได้เช่นกันค่ะ อ่านวิธีได้ที่นี่)

pick d519a51 crate login form
pick c6cda7e Validate email
pick b9c3458 Validate psw
pick ff6c9f5 Login user to system when user is valid
Enter fullscreen mode Exit fullscreen mode

ส่วนด่วนล่าง commit ที่เราเลือกมา 4 อันนั้น เป็นคำอธิบายการใช้ command ต่างๆ ซึ่งที่เราจะเลือกหยิบมาใช้ใน blog นี้นั้น ก็คือ reword นั่นเองค่ะ ซึ่งเป็นการ edit commit message

โดยดูจาก commit message แล้วเนี่ย... มี commit ที่เราอยากจะแก้อยู่ 2 อัน นั่นก็คือ

  1. d519a51 crate login form อยากจะแก้ให้เป็น Create login form
  2. b9c3458 Validate psw อยากจะแก้ให้เป็น Validate password

ทำได้โดยการนำ reword ไปไว้ด้านหน้า commit message ที่เราอยากจะแก้ไข แบบนี้

reword d519a51 crate login form
pick c6cda7e Validate email
reword b9c3458 Validate psw
pick ff6c9f5 Login user to system when user is valid
Enter fullscreen mode Exit fullscreen mode

หลังจากนั้นให้ save & quit ออกจาก vim editor หลังจากนั้นเราจะเห็นว่า terminal ของเราได้เปิด vim editor หน้าใหม่ขึ้นมาให้เราโดยอัตโนมัติ ให้เราแก้ commit message นั่นเองจ้า ทีนี้ ก็แก้ไขแล้วก็กด save & quit ออกมาทีละ message จนครบทุก commit ที่เราเลือก เพียงเท่านี้ ก็ได้ commit message ใหม่ ไฉไลกว่าเดิม

หากใครยัง งงๆ อยู่ นั้นเราจะขออัดเป็น gif สั้นๆ ให้ดูกันละกันนะคะ ^^ (ขออภัย รูปเล็กไปนิดนึง)
git interactive rebase

เราขอบอกก่อนว่า ถ้าเกิดใครที่รู้ตัวทัน อยากจะแก้ไขแค่เฉพาะ 1 commit ก่อนหน้าเพียงแค่อันเดียว ไม่จำเป็นต้องใช้ interactive rebase mode ก็ได้ค่ะ เพราะว่าเราสามารถกลับสู่สามัญ แล้วไปใช้ amend ได้ ตัวอย่างเช่นด้านล่างนี้

$ git commit --amend -m 'new commit message'

// หรือ

$ git commit --amend  // อันนี้จะไปเปิด vim editor
Enter fullscreen mode Exit fullscreen mode

Reference:

Discussion (0)