【GitHub】リモートブランチにプッシュしてしまったコミットメッセージを修正する

### 1.今回の状況
作業ブランチ上で、GitHubのリモートリポジトリへプッシュした後に、コミットメッセージの誤りに気づきました。
デフォルトのブランチへはまだマージを行っていない状況です。

### 2.使用環境
- mac.os バージョン10.15.6
- Ruby 2.6.6
- Rails 6.1.3.1
- psql (PostgreSQL) 12.6

### 3.早速やってみる
今回はこちらのサイトを参考にやってみました。
参考：[Gitのコミットメッセージを後から修正変更する方法！](https://qumeru.com/magazine/510)

#### ①修正するコミットメッセージを確認
まず修正したいコミットが何番目なのか確認します。
<img width="500" alt="メッセージ修正前GitHub.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689555/c6096eb2-993d-8542-36c1-4c2059a7dac7.png">
GitHub上では下が古く、上に向かって新しいコミットメッセージが並びます。
今回は上から2つ目の「挨拶を英語おに変更う」を修正します。

```ruby
# git rebase -i コマンドを実行して修正するコミットを選択
# HEAD~nをつけることで該当コマンドが最上位に来る(今回はn=2)
test_commit_mistake % git rebase -i HEAD~2
```

参考1: [【Git】rebaseコマンドの理解](https://qiita.com/itmaromaro/items/2a87135485d84899bc1c)
参考2: [6. rebase -i でコミットを修正する](https://backlog.com/ja/git-tutorial/stepup/33/)

#### ②該当のコミットメッセージのeditに変更
テキストエディタが起動するので`pick`を`edit`に変更して、保存してテキストエディタを閉じます。
<img width="500" alt="atom editに変更画面.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689555/756bd729-ef4a-2fe6-3b13-f6dbf71c4670.png">

すると、ターミナル上で

```ruby
Stopped at b16ad30...  挨拶を英語おに変更う
You can amend the commit now, with

  git commit --amend 

Once you are satisfied with your changes, run

  git rebase --continue
```

と表示されます。この順に従って進めていきます。

#### ③コミットメッセージを修正
今回は「挨拶を英語おに変更う」を「挨拶を英語に変更」に修正します。

```ruby
# git commit --amend -m コマンドを実行して修正する
# -mをつけることでテキストエディタを開かずに修正できる
test_commit_mistake % git commit --amend -m "挨拶を英語に変更"
[detached HEAD 95cfc4b] 挨拶を英語に変更
 Date: Thu Apr 29 08:51:45 2021 +0900
 1 file changed, 2 insertions(+), 2 deletions(-)
```

参考:[7.6 Git のさまざまなツール - 歴史の書き換え](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E6%AD%B4%E5%8F%B2%E3%81%AE%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88)

#### ④修正を完了させる

`git rebase --continue`で完了です。

```ruby
# rebaseを続行し、完了させる
test_commit_mistake % git rebase --continue
Successfully rebased and updated refs/heads/feature/introduce.
```
参考：[git rebase についてまとめてみた](https://qiita.com/KTakata/items/d33185fc0457c08654a5#)

再度コミットメッセージを確認すると、修正ができていることが分かります。

```ruby
test_commit_mistake % git log --oneline
02f1d4a (HEAD -> feature/introduce) やり取りを追加
95cfc4b 挨拶を英語に変更 #今回修正箇所
7712b62 挨拶を追加
7ae483a init
```

#### ⑤GitHubに再プッシュ
ローカルブランチでの修正が終わったので、リモートブランチに修正を反映させます。
今回は既にプッシュを行っているため、
`git push　--origin`のコマンドを使用するとプッシュに失敗します。

```ruby
# 作業ブランチにいることを確認後
test_commit_mistake % git push origin HEAD
To https://github.com/hogehoge/test_commit_mistake.git
 ! [rejected]        HEAD -> feature/introduce (non-fast-forward)
error: failed to push some refs to 'https://github.com/hogehoge/test_commit_mistake.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

今回は競合箇所がないか確認した後に `--force`オプションをつけて強制的にプッシュを行います。
**※リモートブランチが強制的にローカルブランチの内容で上書きされてしまうので共同開発等、複数人で使用する際は要注意**

```ruby
test_commit_mistake % git push --force origin HEAD
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (6/6), 633 bytes | 633.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/hogehoge/test_commit_mistake.git
 + 6f5ca4a...02f1d4a HEAD -> feature/introduce (forced update)
``` 
GitHub上でもコミットメッセージが修正できていることが確認できました。
<img width="500" alt="メッセージ修正後GitHub.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689555/6de76b28-b726-1e2d-8878-486c0165df1a.png">

### 4.まとめ
コミットメッセージを含め、不具合がないか等確認してから行う。
`--force`は強制的にプッシュできるためなるべく使用しないよう気をつける。
### 5.最後に
記事の感想や意見、ご指摘等あれば伝えていただけるとありがたいです。
読んでいただき、ありがとうございました。