しばしばGitのコミットメッセージを変更したいことがあります。リモートリポジトリにプッシュした後は複数人間の不整合を少しでも避けるため滅多に変更しないのですが、プッシュ前のコミットが手元にいくつか残っている時は割と変えたくなります。多くのGUI付きのGitの関連ツールはその画面から任意のコミットのメッセージを変更できるのですが、コンソールからは意外と面倒です。この面倒を解決するためのスクリプトを紹介します。
コミットとメッセージを用意すれば、メッセージ変更手順を自動で行ってくれるスクリプトを作ります。具体的なコードは次です。
#!/bin/bash # 引数の数が2でなければヘルプを表示して終了 if [ "$#" -ne 2 ]; then echo "使い方: $0 [変更したいコミットのハッシュ] [メッセージ]" exit 1 fi # 最初の引数をCOMMIT_HASHに、2つ目の引数をNEW_MESSAGEに代入 COMMIT_HASH=$1 NEW_MESSAGE=$2 # 指定されたコミットの親コミットのハッシュを取得 PARENT_HASH=$(git rev-parse "${COMMIT_HASH}"^) # rebase時のエディタをsedにして、指定されたコミットを自動で編集モードに変更 # rebase時はどのコミットをどうするかを指定するので、それを制御する export GIT_SEQUENCE_EDITOR="sed -i -e '/^pick ${COMMIT_HASH:0:7}/s/pick/edit/'" # 親のハッシュを起点にインタラクティブrebaseを開始 # rebase時にはrebaseの引数に指定したハッシュに連なるコミットが表示される git rebase -i "$PARENT_HASH" # ここでGIT_SEQUENCE_EDITORが効いて、このスクリプトの引数で指定したコミットが編集モードになる # コミットメッセージを新しいメッセージに変更 git commit --amend -m "$NEW_MESSAGE" # 処理を解決する git rebase --continue
次のように使えます。
$ bash ./recomment.sh 使い方: ./recomment.sh [変更したいコミットのハッシュ] [メッセージ] $ bash ./tmp.sh 7e7a7a07953b4bc46d42f6430d400dd8c7a07ead "メッセージ変更テスト変更後" Stopped at 7e7a7a0... メッセージ変更テスト変更前 You can amend the commit now, with git commit --amend Once you are satisfied with your changes, run git rebase --continue > pre-commit > node gitHooks/preCommit.cjs ---run preCommit.js--- [] ---end preCommit.js--- [detached HEAD 0bd43e7] メッセージ変更テスト変更後 Date: Fri Oct 27 10:29:51 2023 +0900 1 file changed, 1 insertion(+) Successfully rebased and updated refs/heads/develop.
こうするとコンソールでも簡単にコミットメッセージを変えられるようになります。手を進めるにつれてメッセージの内容が不適切であったとわかったり、プッシュ前にコミットメッセージの誤字脱字に気づいたりなどした時に使うと便利です。