コミット整理などをするときにgit rebase -i
を打つと出てくるこの説明画面↓
多用するpick
,squash
をはじめほとんどのコマンドは説明を読めば使い方が大体理解できますが、exec
だけ何に使うのかよく分かりません。ということで活用法を考えてみました。
その他のコマンドについて適当なページをリンクしようと思ったらいい記事が見つからなかったので末尾へ。
何が出来るのか
英語で説明されている通り、exec
以降のシェルコマンドを実行できます。複数のコマンドを実行したい場合は;
で実行できる模様。当然パイプも使えます。コミットとコミットの間の新たな行に記載するという発想がpick
やsquash
ばかり使ってた私の頭にはなかったため、試しに書いてみても動かない、長らく意味不明なコマンドとなっていました。
pick abc123 hoge
exec ここに何かシェルコマンドを記載
squash def456 fuga
pick ghi789 piyo
...
活用法① 2つ以上前のコミットに入れたい変更がある
参考記事:git-rebaseのexecを使ってstashした内容を履歴に埋め込む
例えば以下のような状況を考えてみましょう。コーディング中、だいぶ前に編集したファイルで誤字を発見してしまった場合。
$ git log --oneline
abc123 hoge //ここで編集したファイルに誤字発見!
def456 fuga
ghi789 piyo
直前の編集であればとりあえずコミットしておいて後でsquash
すれば事足りますが、直したいコミットが2つ以上前の場合はそう単純ではありません。ここでexec
が真価を発揮します。
①とりあえず追加の修正をstash
git stash [必要に応じてコマンドオプション]
②git rebaseの画面でexec
を埋め込んでstashを適用!
pick abc123 hoge
exec git stash pop; git commit -a --amend -C HEAD
squash def456 fuga
pick ghi789 piyo
え?editで直接編集すればいいじゃんって?1行で処理するのがカッコいいんだよ。
なお、後続のgit commit
のオプションについて、-a
はgit add
を省略するためのオプション、--amend
は直前のコミットの編集、-C HEAD
は直前のコミットメッセージを再利用するためのオプションとなっています。
活用法② テストがいつ動かなくなったのか調べたい
実装完了後、テストを回してみたら既存のテストが動かなくなったという経験は皆さんあるはず。そんなときexec
を使えばいつテストが動かなくなったのか調べることができます。
pick abc123 hoge
exec npm test
squash def456 fuga
exec npm test
pick ghi789 piyo
例えばこんな感じ。ついでにコミット整理もできて一石二鳥ですね。途中でテストが失敗した場合はその時点でリベースも中断されるので、問題が起きた時点のコミットを修正してgit rebase --continue
で再開しましょう。
付録-その他のコマンドについて
コミットの行に書くもの
コマンド | 内容 |
---|---|
p, pick | コミットをそのまま適用する |
r, reword | コミットをそのまま適用するが、コミットメッセージを編集する |
e, edit | コミットを適用した状態でエディターを開き、コミット内容を編集する (変更を行った場合そのコミットが上書きされる) |
s, squash | コミットを直前のコミットに統合し、コミットメッセージを編集する |
f, fixup | コミットを直前のコミットに統合し、コミットメッセージは編集しない (直前のコミットメッセージが利用される) |
d, drop | コミットを削除する(行削除でも同様の挙動) |
m, merge | コミットを利用して特定の<label>の位置でマージコミットを作成する |
新たな行に書くもの
コマンド | 内容 |
---|---|
b, break | リベース操作を中断してエディターを開く |
l, label | 現在のHEAD位置に特定の<label>で名前を付ける |
p, pick | 特定の<label>の位置まで操作を巻き戻す |