Git の便利コマンド色々 〜ソースコードリーディング編〜

分散型のバージョン管理システムとして利用者も増えてきた(ような気がする) Git ですが、単なるバージョン管理システムとしての機能以外にも色々と便利な機能があったりします。

今回は、ソースコードリーディングに使える Git の便利なコマンドをご紹介します。

git grep

Git で管理されているファイルを grep します。find + grep よりも高速に grep してくれます。

じっくりとソースコードを読み込むのであればタグ管理システムを使いたくなりますが、さっと確認したいというときや、タグで管理できないエラーメッセージを手がかりにソースコードを読むときなどに重宝します。

git grep -e <pattern>

として、検索パターンを指定します。パターンには正規表現をつかうことができます。-e は省略可能です。

パターンは複数指定することもできます。--and/--or/--not でパターンをどのように組み合わせるか指定できます。デフォルトでは、or で結合されます。

git grep -e <pattern> -- <path>

指定したパスのみを検索対象とします。

git log

git log は、リポジトリのコミットログを表示するコマンドです。

git log は豊富なオプションを指定できます。オプションを駆使することで、ソースコードを時系列で追うことが可能になります。

diff (差分) を表示する
git log -p
git log --stat

-p オプションをつけると、各コミットでの diff も表示してくれるので、より詳細に変更点を確認することができます。

変更されたファイルの概要だけ知りたいときは、diffstat を表示してくれる --stat オプションが便利です。

区間を指定する
git log <since>..<until>

とすると、since コミットから until コミットまでのコミットログを表示してくれます。

パスを指定する
git log <path>
git log <since>..<until> -- <path>
git log -p --full-diff <path>

path を指定すると、path で指定したディレクトリまたはファイルに関する変更を含んだコミットログのみを表示してくれます。区間指定と合わせて使用する場合は、 間に -- を入れます。また、git log -p とすると、指定したパスに関する diff のみ含んだコミットログになりますが、--full-diff をつけると、指定したパス以外も含んだ全ての diff を表示してくれます。

git describe

指定したコミットを近いタグを含んだ表現で表してくれます。

git describe --contains

とすると、そのコミットを含む(そのコミットよりも後につけられた)タグで表現してくれます。Linux カーネルなどバージョンごとにタグを打っているリポジトリでは、指定したコミットがどのバージョンに含まれているのか知ることができます。

git blame

ソースコードの各行が、どのコミットで変更されたものか表示してくれます。

-L オプションで、どの行を対象とするか指定することができます。

まとめ

Git の豊富なコマンドの中から、ソースコードリーディングに使えそうなコマンドをご紹介しました。

それぞれのコマンドには、他にも豊富なオプションがあります。man ページ等で確認してみてください。

Git は使い込めば使い込むほど便利になっていくツールという感じがしています。他にも便利なコマンドがあれば、是非教えて下さい。