6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

プライム・ブレインズAdvent Calendar 2024

Day 9

git rebase -i の exec って何だ? #Git

Last updated at Posted at 2024-12-08

コミット整理などをするときにgit rebase -iを打つと出てくるこの説明画面↓
image.png
多用するpick,squashをはじめほとんどのコマンドは説明を読めば使い方が大体理解できますが、execだけ何に使うのかよく分かりません。ということで活用法を考えてみました。
その他のコマンドについて適当なページをリンクしようと思ったらいい記事が見つからなかったので末尾へ。

何が出来るのか

英語で説明されている通り、exec以降のシェルコマンドを実行できます。複数のコマンドを実行したい場合は;で実行できる模様。当然パイプも使えます。コミットとコミットの間の新たな行に記載するという発想がpicksquashばかり使ってた私の頭にはなかったため、試しに書いてみても動かない、長らく意味不明なコマンドとなっていました。

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のオプションについて、-agit 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>の位置まで操作を巻き戻す
6
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?