はじめに
皆さんはGitを使う際、一部変更を入れ忘れてcommitしてしまうことはありますか?私は比較的よくあります。
私はこれまで変更を入れ直す際、git log
してコミットメッセージを取得して、git add
して(実際はVSCodeの機能を使うことが殆どなのですが…)、git commit --amend -m ...
としていたのですが、よく考えればそれ用のコマンドを作れば楽なのでは?と思い、コマンドを作成してみました。
コマンド
git log --oneline -n 1 | sed -r 's/^[0-9a-f]+ //' | xargs -I message git commit --amend -m message
解説
git log --oneline -n 1
git log
でgitのコミットログを見ることができます。
--oneline
オプションで、各commitが1行で表示されるようになります。
-n 1
で最新の1コミットのみを表示させることができます。
これによって、最新のコミット1つ1行を取得でき、これを次のコマンドに送り処理する下準備ができます。
sed -r 's/^[0-9a-f]+ //'
先のコマンドで取得した文字列は、1a2b3c4 コミットメッセージ
のように、ハッシュ値が付いたコミットメッセージになっています。今回コミットメッセージ(+その直後のスペース)を取り除きたいので、更に処理を加えます。
sed
はストリームエディタで、複数行の入力に対し処理を行う際に重宝するコマンドです。今回は文字列の一部削除に利用しています。詳しくは他に良い記事があるのでそちらに譲ります。
-r
オプションはsedのコマンドで正規表現を使うという意味になります。
's/^[0-9a-f]+ //'
は、ざっくり説明すると「行先頭の0-9a-fでできた文字列と、その次の半角スペースを、空文字列で置換する」というコマンドです。
これによって、純粋な最新のコミットメッセージを次のコマンドに送ることができるようになりました。
xargs -I message git commit --amend -m message
先のコマンドで生成した純粋なコミットメッセージを使って、git commit --amend
を行います。
xargs -I message
は、パイプで送られてきた文字列を以降のコマンドのmessage
の箇所で利用するというものになります。
なので、以降のgit commit --amend -m message
は実行され、そのコミットメッセージはここまでの処理で作られている最新のコミットメッセージになります。
最後に
このコマンドはalias
にもできるので、宜しければご利用下さい。