created: 2023-10-04T03:57:47.601Z

ここ最近に自分がコミットをしたブランチを更新日時順で一覧する

複数のブランチにまたがって並行して作業していたり、ブランチからさらにブランチをきったりしていると、いまの作業で HEAD にあたる ref がどこにあるのかよくわからなくなったりする。自分が作業しているブランチを取得して、それも一番直近に作業したブランチがどれだかわかる形で一覧したい。

コマンド

$ git for-each-ref \
  --no-merged origin/master \
  --sort -committerdate \
  --format="%(if:equals=$(git config user.name))%(authorname)%(then)%(committerdate:short) %(refname:short)%(else)%(end)" \
  --omit-empty \
  --count=10

説明

for-each-ref でリポジトリの中のブランチやタグなどが一覧される。

いろいろ注文をつけられる。

  • --no-merged origin/master
    • すでに master にマージされたものは省く
  • --sort -committerdate
    • コミットされた日付順
    • 先頭に - をつけると逆順の指定になる
  • --omit-empty
    • format の結果が空行になったら出力しない
  • --count=10
    • 直近のものから 10 個処理する
    • ただし直近 10 個の中から --omit-empty でフィルタされる 🙁

format オプション

git の format オプションはいろいろできる。意味ごとに改行をいれるとこんな感じ。

%(if:equals=$(git config user.name))%(authorname)
%(then)
  %(committerdate:short) %(refname:short)
%(end)"

まず $(git config user.name) で自分の %(authorname) が取得できる。

そして if:equals=... という構文で三項演算子のような条件分岐が書ける。

  • $(git config user.name)%(authorname) を比べて
    • 等しい場合に %(committerdate:short) %(refname:short) を出力
    • そうでなければなにも出力しない

という意味の指示になる。なお、--omit-empty をつけてるのでマッチしない行は改行も出ないで済む。

committerdate:short:short は日付の情報をどのように表示するかのオプションで、他にも :iso:rfc のような形式が指定できる。

refname:short:short も同様にブランチ名のフルネームをどのようにフォーマットするか指定できるもの。こちらは lstrip=1 などとしてパスのどこまでとってくるかを指定できたりする。

%(committerdate:short) %(refname:short) という指定だと出力はこんな塩梅になる。

2023-10-04 origin/12345-myapp-branch
2023-10-03 22345-test

時間くらい見られたらいいかもしれない。 %(committerdate:format:%F %T) としてもいいかも。

貝と羊の中国人 (新潮新書)
[ad] 貝と羊の中国人 (新潮新書)
加藤 徹 (新書)