はじめに

gitで複数の機能を並行して開発する時などブランチを頻繁に切り替えることはあるかと思います。 gitでは git checkout -, git rebase - のように - を前のブランチのエイリアスとして使うことができますが、 三つ以上のブランチを行き来したりする際には使えません。

そこでgitで直近checkoutしたbranchを表示する git recent-branch というgitのサブコマンドを作成しました。

sachaos/git-recent-branch

$ git recent-branch
develop                                  (16 seconds ago) Fri May 12 00:06:52 JST 2017
feature/hogehoge                         (28 seconds ago) Fri May 12 00:06:40 JST 2017
feature/test2                            (41 seconds ago) Fri May 12 00:06:27 JST 2017
master                                   (57 seconds ago) Fri May 12 00:06:11 JST 2017
feature/test                             (2 minutes ago)  Fri May 12 00:05:02 JST 2017
ae8bcd440123ee5db3fa994eb618f918a857ed5b (1 week ago)     Tue May  2 21:54:36 JST 2017

これと peco を組み合わせることで、直近checkoutしたブランチを楽に行き来することができます。

デモ

asciicast.gif

Tips殴り書き

内部の挙動

git の操作ログはgit管理下のディレクトリにある .git/logs/HEAD に保持されています。 これをパースしてcheckoutのログを拾ってきて整形して表示するだけと非常にシンプルな作りになっています。 git reflog コマンドもこいつを利用しているようです。

git のサブコマンドの作り方

知らなかったのですが、gitは git-recent-branch のようなコマンドを用意してあげれば、 git recent-branch と実行した時にハイフンで区切られているコマンドを実行してくれるようです。 これでサブコマンドのような振る舞いをさせることができます。

GolangでTwitterライクな時間表示

GolangでTwitterライクな表示(7 hours ago のような)をさせる際に以下のパッケージが便利でした。 相対的な時間表示以外にもファイルサイズなど、自前で実装するのもめんどくさい便利な変換をしてくれます。

fmt.Printf("This was touched %s.", humanize.Time(someTimeInstance)) // This was touched 7 hours ago.

dustin/go-humanize: Go Humans! (formatters for units to human friendly sizes)

まとめ

  • git recent-branch というコマンドを作成しました。
  • gitのサブコマンド簡単に作れるよ。
  • go-humanize 便利。

作ってから数週間経ちますが、これでブランチの切り替えのストレスが解消されました。 今ではこれがない生活は考えられません。 ぜひ試してみてください。