ブログ
Gitコミットメッセージ間違えた時、SourceTreeでの対処法

目次
みなさん、こんにちは。
Jackieです。
Gitで開発しているときに、コミットした後や昔のコミットを確認している時に「コミットメッセージ誤字った!」「バージョン番号間違えた!」などコミットメッセージを間違えて修正したくなったことはありませんか?入力ミスや変換ミスなど、間違えではなくてもただ変更内容をもっと明確に記載したい、綺麗なコミット履歴を保ちたいなど、コミットを直したい理由は様々あるでしょう。
実はGitの「Amend」(git commit -amend
)と「Interactive Rebase」(git rebase -i
)というこの2つの機能を使うとコミットしたメッセージを編集することが可能です。今回の記事ではSourceTreeを使ってこの2つの方法を解説していきたいと思います!
※もちろん、最初から間違わないに越したことはないです!
はじめに
Amend(アメンド)機能を使うと一番最新のコミットを修正することができる一番簡単な方法になるでしょう。コミットメッセージ以外にも、コミットし忘れたファイル変更も新しいコミットをせずに同じコミットで追加できるので、簡単にコミットを管理できます。
では、最後にコミットしたものではなく、もっと古いのコミットはどうしたらいいですか?
そんな時はInteractive Rebase(インタラクティブ・リベース)を使って古いコミットも修正できます!リベースは簡単に言うとGitの履歴を変えることができる機能です。
一番最新のコミットを編集したい場合 (Amendの使用方法)
コミット画面で「コミットオプション…」のドロップダウンメニューから、「直前のコミットを上書き」を選択。

すると、テキストボックスに最後のコミットメッセージが現れます。

下記の図の①の所に、新しいコミットメッセージを入力し、② いつものようにコミットをすると警告メッセージが表示されます。③ 確認して「OK」ボタンで完了します。

新しく編集したメッセージが履歴の画面で反映されます。

過去のコミットを編集したい場合(Interactive Rebaseの使用方法)
編集したいコミットが直前コミットではない場合は、インタラクティブリベースで編集できます。
Step 1
編集したいコミットの一つ前を選択しましょう。

今回は3行目の「ああああああ」が編集したいので下の「作業中」というコミットを選択しましょう。
Step 2
Step 1で選択したコミットを右クリックすし、ドロップダウンメニューから「…の子を対話形式でリベース」をクリックします。

Step 3
編集できるコミットの一覧が表示されます。
編集したいコミットを選択した状態(青の状態)でこのウィンドウ下の左から2番目「メッセージを編集」ボタンをクリックします。

Step 4
コミットメッセージの編集欄に新しいメッセージを入力し、OKボタンをクリックします。

Step 5
編集したコミットメッセージが反映されます。
もう一度OKをクリックしてリベースを完了させましょう。

Step 6
これでローカル上で新しいコミットメッセージが反映されます。
ここでリモートにも反映したいところです。
編集した部分が以前リモートにプッシュしていなければ、通常通りプッシュすることができます。
しかし、既にリモートにプッシュしてしまった場合だと、このようにリベースを行ったところから枝分かれして、2つのブランチが見えます。

リモート上の履歴は編集前の状態のままですが、ローカルの履歴が編集したコミットとその以降のコミットが新しく生まれてきました。
リモートとローカルが異なるため、通常のプッシュをしてみるとこのようなエラーメッセージが発生され、プッシュは失敗してしまいます。こうして強制プッシュが必要となります。

編集したいコミットが既にプッシュしてしまっている場合
強制プッシュの注意点
強制プッシュ(git push -f
)は、ローカルの内容を破壊的にリモートリポジトリを上書きしてしまい、慎重に行う必要があります。
同じブランチで複数人で開発を行っていた場合は、タイミングによって他の人がコミットした内容が上書きされたり、マージ時の競合が起きたりしてしまうことがあります。
したがって、基本的に強制プッシュをしていいのは個人プロジェクトのような一人が使用しているブランチで作業している時のみです!
会社などではチームメンバーに影響してしまうし、取り付かないことをしてしまう大きなリスクがあるのでリモート履歴の書き換えや強制プッシュはおすすめしません。
SourceTreeで強制プッシュをする方法
SourceTreeのメニューバーから「環境設定」を開きます。

「高度な設定」のタブから「強制プッシュを許可する」の項目をチェック付けます。

プッシュする時に、「強制プッシュ」のオプションがチェックできるようになります。

チェック付けてOKボタンをクリックすると警告メッセージが表示され、またOKボタンをクリックして強制プッシュが実行します。

まとめ
以上で2つのコミットメッセージを修正する方法を紹介しました。Amendで直前のコミットを編集できます。そしてInteractive Rebaseは古いコミットを編集できます。
しかし、こういった編集作業をすると、リモートとローカル履歴が合わなくなり、統合するために強制プッシュが必要となることがあります。こんな状況にならないよう、コミットメッセージを間違わないことが一番です。
上でも説明したように、強制プッシュが必要となった際に、複数人で開発している場合、他の人のコミットしたものが上書きされたり、コミットが競合してマージできなくなったりする恐れがあります。
つまり!
使ってはいけない時:
- 会社、チームなど複数人で共有しているリモートブランチ
- 公開されているリポジトリなど、誰かがプルした可能性があるリポジトリ
使ってもOKな時:
- 自分1人しか利用していないリモートブランチ(例えば個人のプロジェクト)
- リモートにプッシュする前(強制プッシュの必要が発生しないよう)
どうしても修正しないといけない時、こちらのルールを従えば大きな問題が起きないはずです!とは言え、強制プッシュや修正などの行動しないで済むよう、コミットメッセージを間違いないよう気を付けましょう!
この記事で紹介したAmend、Interactive Rebase、強制プッシュでどんなことができるか、どんなことを気をつけるべきか、少しでも理解できたら嬉しいです。
これからもみんなでGitとSourcetreeと、仲良くなりましょう!