notebook

都内でWEB系エンジニアやってます。

Git logでPRに貼り付ける用のワンライナー

コミット粒度に気を付けてコメントもしっかり書いておくと、PR作成してどんなことやったかを示す場合にコミットハッシュとコメントのリストを貼り付けることがある

以前コード結構書いていたときは手動でやっていた

最近やろうと思ったら意外と作業がだるかったのでワンライナーで貼り付けられるようにした

下記のスクリプトをzshやbashのスクリプトとして登録しておく(aliasでも良い)

function gll(){
  git log --reverse $(git merge-base $(git for-each-ref --format='%(refname:short)' refs/heads | grep --color=no -P 'main|master') $(git branch --show-current))..$(git branch --show-current) --pretty="format:%h %s"
}

タイトル的にはワンライナーなので次のようにコマンド実行すればOK

git log --reverse $(git merge-base $(git for-each-ref --format='%(refname:short)' refs/heads | grep --color=no -P 'main|master') $(git branch --show-current))..$(git branch --show-current) --pretty="format:%h %s"

こんな感じになる

$ gll
6f05d16 feat: json形式の出力で何もannotationがない場合はから配列を返すようにした
f693674 feat: json形式の出力の最後に改行を入れるようにした
e31da05 test: json出力で空の場合のテストコードの追加

結論だけだとここまでだが、以下に段階を踏んで進めたログを載せておく

分岐元からのコミットログを出力する

git log $(git merge-base main your-feature-branch)..your-feature-branch --pretty="format:%h %s"
$ git log $(git merge-base main your-feature-branch)..your-feature-branch --pretty="format:%h %s"
e31da05 test: json出力で空の場合のテストコードの追加
f693674 feat: json形式の出力の最後に改行を入れるようにした
6f05d16 feat: json形式の出力で何もannotationがない場合はから配列を返すようにした

main(またはmaster)ブランチから分岐したyour-feature-branchのコミットログを表示する

  1. git merge-base main your-feature-branchで、mainブランチとyour-feature-branchの共通の祖先(分岐ポイント)を見つける
  2. git logで分岐ポイントからyour-feature-branchまでのコミットログを表示

main(またはmaster)ブランチ以外のブランチから分岐した場合は、適切なブランチ名に置き換える

ブランチ名の取得

この使い方をしたいケースはPRを出すブランチで実行してPRに貼り付けて…という感じなのでブランチ名もほぼ固定で良さそう

currentブランチとデフォルトブランチを取得できるようにしたほうが便利そう

current branch

git branch --show-current

デフォルトブランチ

リモートブランチへアクセスすれば取得する方法はあるようだった、このくらいのことでリモートリポジトリへアクセスしたくなかったので下記の方法を取っている

だいたいmainmasterかという前提のもと次のように出力する

git for-each-ref --format='%(refname:short)' refs/heads | grep --color=no -P 'main|master'

zshの設定でコマンドとして使えるようにする

これまでの工程をすべて含めると以下のようにワンライナーで実行できるのでそれをzshのfunctionに設定する

function gll(){
  git log --reverse $(git merge-base $(git for-each-ref --format='%(refname:short)' refs/heads | grep --color=no -P 'main|master') $(git branch --show-current))..$(git branch --show-current) --pretty="format:%h %s"
}
  • --reverseオプション

普通に出力すると最新のコミットが一番上に来る、PullRequestなどで列挙する場合は実装した順番に上から表示させたほうが直感的なので逆順に表示させるため--reverseオプションをつけている

$ gll
6f05d16 feat: json形式の出力で何もannotationがない場合はから配列を返すようにした
f693674 feat: json形式の出力の最後に改行を入れるようにした
e31da05 test: json出力で空の場合のテストコードの追加

いい感じ