mainとdevelopmentの差分のPR番号一覧を取得
$ git log --merges --oneline origin/main...origin/development | grep "Merge pull request" | sed -E 's/.*#([0-9]+).*/\1/'
補足
git log --merges --oneline
--merges
: マージコミットのみを表示するオプション
Gitリポジトリには、通常のコミット(単純な変更を記録するコミット)と、ブランチの統合を行った際に生成されるマージコミットがあります。
--merges
オプションを使うと、マージコミットだけがフィルタリングされ、表示されます。これにより、他の通常のコミットは表示されません。
--oneline
: 各コミットを1行で簡潔に表示するオプションです。
通常、git log
はコミットIDや日時、作成者、コミットメッセージなどを複数行にわたって表示しますが、--oneline
オプションを使うと、コミットの短縮版ID(SHAの先頭7文字)とコミットメッセージの先頭部分だけが1行で表示されます。これにより、コミット履歴を簡潔に見ることができます。
sed -E 's/.#([0-9]+)./\1/'
正規表現の構造
sed -E 's/.*#([0-9]+).*/\1/'
-E
- 拡張正規表現 (Extended Regular Expressions) を使用するオプションです。通常の正規表現よりも強力なパターンが使えます。
s/.../.../
- これは
sed
コマンドの置換 (substitution) 構文です。s/
の後ろにある最初の部分が検索するパターン、次の部分が置換する内容です。
正規表現の詳細
.*#([0-9]+).*
.*
- 意味: 任意の文字が0回以上繰り返される部分を表します。
- 解説:
.*
は、任意の文字列を指していて、行の先頭から#
までの部分をすべてマッチさせます。
#
- 意味: 文字
#
をそのままマッチします。 - 解説: これにより、プルリクエスト番号の先頭にある
#
を探します。
([0-9]+)
- 意味: 数字 [0-9] が1回以上連続する部分を表します。
- 解説: # の直後に続く数字部分がここにマッチします。カッコ () で囲んでいるため、キャプチャグループとして扱われ、後でこの部分を取り出すことができます。ここではプルリクエスト番号に相当する部分です。
.*
- 意味: 再び任意の文字が0回以上繰り返される部分です。
- 解説: #123 の後に続く任意の文字列全体を表しますが、これは置換時に無視されます。
置換部分 \1
- 意味: これは正規表現内の 1番目のキャプチャグループを指します。
- 解説: ここでは
([0-9]+)
にマッチした部分(つまり、プルリクエスト番号)が\1
で参照されます。\1
によって、マッチしたプルリクエスト番号だけを出力します。
全体の動作
この正規表現は次のように動作します。
-
.*#([0-9]+).*
: 任意の文字列の後に#
と数字列が続くパターンを探し、その数字列をキャプチャします。 -
\1
: キャプチャされたプルリクエスト番号だけを出力します。
例
たとえば、以下のマージコミットログ:
Merge pull request #123 from some-branch
このログに対して、正規表現は次のように処理します。
-
.*
でMerge pull request
という部分を無視します。 -
#
にマッチし、その後の数字123
をキャプチャします。 - 残りの部分 from some-branch は再度
.*
で無視されます。 - 最後に
\1
でキャプチャされた123
だけを出力します。
結果的に、123
だけが抽出されます。