Edited at

gitのブランチリストを鮮度順に表示する

More than 1 year has passed since last update.


この記事を書いた2013年当初のgit(version 1.8)から月日は流れ、いまどきのgit (version 2.7以降) は、--sort オプションがあるのでそれを使うのがよいでしょう。というわけでこれを追記しておきます。



git branch --sort=<key>



  • --sortオプションのkeyを指定するだけになりました。 (version 2.7.0以降)

  • 使えるkey は git-for-each-ref のそれと同じなので、日付順にソートしたいときには、authordate,committerdate などが指定可能です。

  • 同じようにタグのリストも git tag --sort=taggerdate のようにタグ付け日時順に並び替えられます。

--sortオプションやkeyの詳細については以下を参照してください。

追記はここまで 2017/3/22

以下は 2013/08/28 の記事 (git version 1.8.2 で検証)


gitのブランチ一覧といえば



  • git branch ローカルブランチ一覧


  • git branch -r リモートブランチ一覧


  • git branch -a ローカルとリモートのブランチ一覧

とするのですが、アルファベット順にソートされて表示されてしまいます。

ちょっとした作業でテキトーに作ってしまったブランチがいつ頃作られたり使われたりしたのか知りたくなることがあります。

ブランチ名に日付や時間でもつけていればよいのでが、まあテキトーに作ってるときはそんなことも忘れてhogehogeとか適当に済ませてしまうのはよくあることです。ここでは主にローカル作業中に量産してしまった謎ブランチをなんとなく鮮度順に並べてみる方法について書いてみます。


git reflog

git reflogを使えばチェックアウトやマージの変遷がざっとわかります。

どのブランチからどのブランチへチェックアウトしたかもわかるので、記憶を辿るのにも役に立つでしょう。

git log -g --abbrev-commit --pretty=oneline

と同等です。


git for-each-ref

git for-each-refというコマンドはobjectsize, authordate, committerdate, taggerdateなどでソートすることができます。ソートのキーには複数指定できますし、出力フォーマットもある程度カスタマイズできます。

例えばローカルブランチをcommiterdateの新しい順に上から表示するには

git for-each-ref --sort='-*committerdate' --format="%(refname:short)" refs/heads/

さらに詳しくはgit help for-each-ref参照してください。


ls .git/refs/head

単にgit branch hogehogeみたく作りっぱなしのまま、何もコミットしなかったブランチについていつ頃のものだったか知りたいときにgit refloggit for-each-refではちょっとうまくいきません。

そんなときは

ls -t .git/refs/heads

-tオプションで更新時間順にソート。ls -ltとかオプションはお好きなように。

コミットされたりするとブランチディレクトリのタイムスタンプが変わってしまうのでブランチ作成日ではないことに注意です。

リモートブランチのことについてはわかりませんし、また、git gcすると.git/refs/heads以下が綺麗に掃除されてしまうのでlsしても何も出てきません。そのときはきっぱり諦めることです。

「ブランチ作成日時」はgitの関知するところではないので、どうしてもそれを管理したいという場合にはブランチ名にタイムスタンプをつける運用にするのがよさそうですが、それはそれで厄介事が増える(メインの作業ブランチと日付の新しさが必ずしも一致しない等による混乱)ものです。

結局コマンド調べまわってるうちに日が暮れたり夜が明けてしまったりしていて、自分は一体何を開発しているのか、人生とは一体何なのかと思い悩んでしまい、一体自分はここに何を書いているのかもわからなくなります。

鮮度順に並べることよりも、楽ちんなブランチ運用の方法を考えるのがマジオススメです。