จะทำยังไงดีน้าาาา.. อยากแก้คำผิดใน commit message ที่ผ่านๆ มา
Tags: git, rebase, amend, commit
Published: 2021-10-02 09:20:20

---
title: จะทำยังไงดีน้าาาา.. อยากแก้คำผิดใน commit message ที่ผ่านๆ มา
published: true
description: 
tags: #git #rebase #amend #commit
cover_image: https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hvyr5owieacni8jbu8kr.png
---

เคยไหม... ในวันที่เราต้องแก้โค้ดอะไรสักอย่างหนึ่งในวันที่เร่งรีบ แล้วเผลอ 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 อัน ดังนี้

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

```sh
$ git rebase -i HEAD~<number_of_commits> 
// หรือ
$ git rebase -i @~<number_of_commits>
```
ซึ่ง `number_of_commits` ด้านบนนั้น หมายถึง จำนวน commit message ที่เราต้องการจะย้อนไปเริ่มแก้ไข โดยใน branch `feature/login_user` นั้น เราได้สร้าง commit message ขึ้นมาทั้งหมด 4 อัน และอยากจะย้อนกลับไปแก้ไข ตั้งแต่ commit เริ่มต้นเลย ซึ่งก็ย้อนไป 4 อันนั่นเอง เพราะฉะนั้นเราจะต้องใช้ command ด้านล่างนี้

```sh
$ git rebase -i @~4
```

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

```sh
pick d519a51 crate login form
pick c6cda7e Validate email
pick b9c3458 Validate psw
pick ff6c9f5 Login user to system when user is valid
```
ส่วนด่วนล่าง 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 ที่เราอยากจะแก้ไข แบบนี้

```sh
reword d519a51 crate login form
pick c6cda7e Validate email
reword b9c3458 Validate psw
pick ff6c9f5 Login user to system when user is valid
```
หลังจากนั้นให้ save & quit ออกจาก vim editor หลังจากนั้นเราจะเห็นว่า terminal ของเราได้เปิด vim editor หน้าใหม่ขึ้นมาให้เราโดยอัตโนมัติ ให้เราแก้ commit message นั่นเองจ้า ทีนี้ ก็แก้ไขแล้วก็กด save & quit ออกมาทีละ message จนครบทุก commit ที่เราเลือก เพียงเท่านี้ ก็ได้ commit message ใหม่ ไฉไลกว่าเดิม

หากใครยัง งงๆ อยู่ นั้นเราจะขออัดเป็น gif สั้นๆ ให้ดูกันละกันนะคะ ^^ (ขออภัย รูปเล็กไปนิดนึง)
![git interactive rebase](https://media0.giphy.com/media/Rt9gQmSNtwRo9CZgdj/giphy.gif?cid=790b7611af1c924f6af0ff9a9f6810140a20f1dc93b8c769&rid=giphy.gif&ct=g)
 

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

// หรือ

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

Reference:
- https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History