git」タグアーカイブ

gitのお気に入りコマンドなど

お気に入りのgitの設定およびコマンドです。

git status -sb

と登録しておくのがお勧めです。git status –short –branchの省略形です。

通常の場合、

を実行すると、

gitstatus

と、本来必要である情報以上にたくさんのメッセージが表示されます。もちろん、なれないうちは大変助かるメッセージではありますが、慣れてくると冗長すぎてむしろ見通しの悪さを感じてきます。

では、

gitstatussb

と、本来必要な情報を簡潔に表示してくれます。

git 1.8.4以上をお使いならばGitの更新ログにあるようにstatus.shortとstatus.branchというconfigがありますのでそちらを利用するのもお勧めです。

pager = less -r

(参考: どせいけいさんきより)

git diffなどの結果は、core.pagerで設定したコマンドに送られます。現在の設定が不明な場合は

で調べることができます。おそらく、設定していない場合はlessが標準のページャとして使用されていると思います。

標準のlessは長い行を折り返してくれないので、

gitless

こんなかんじで、長い文は右側にはみ出してしまって見通しが悪いです。

.gitconfigに

と設定することで、

gitlessr

長い行は自動的に折り返してくれるので見通しが良くなります。

git diff –word-diff

長い行も一度に表示できるようになって少し見通しが良くなったとはいえ、上記のdiffでは結局どこが変わったのか調べるのはかなり大変です。

を使うと

gitworddiff

変更になった部分だけをハイライトして表示してくれます。知っていると便利なコマンドです。

git commit -v

コミットログの記載画面にコミット内容を表示することができます。

gitcommitv

こんな感じでコミットログ記載部分の下部に今回のコミットではどの部分が変更されたかが表示されます。

git log –graph

僕のおすすめは

です。

gitloggraph

こんなかんじで履歴をコンソール上でグラフィカルに表示してくれます。いろいろ設定オプションがありますが僕は上記を使っています。

もちろん、vim上でgregsexton/gitvを使うという手もあります。

Git:圧縮とリポジトリのサイズ

Git便利ですね。Gitではオブジェクト(ファイルなど)をzlibで圧縮して保持します。それだけではなく、差分を計算したり、複数のオブジェクトを packすることで、単純にすべての履歴を記録するよりも効率的にリポジトリを保持することができます。

duだとファイルサイズではなくてブロックサイズになるので上記コマンドを使います。Landscape – エンジニアのメモを参考にしました。

まずはgit initしただけの状態で。

13.6KiBです。ここからどうなっていくかを見て行きましょう。まずはテキストファイルから。

Gitはファイルをテキストファイルとして認識してくれました。巨大なテキストファイル(24.8MiB)を追加したにもかかわらず、リポジトリのサイズは162KiBに収まっています。これは繰り返し文字列でありzlibによる圧縮が良好に効いていることによります。

ファイルの一部(10000行目のみ)改変してみましょう。

Gitは一行のみの変化であることをきちんと認識してくれました。しかし、リポジトリのサイズは310KiBとなっています。先ほどのリポジトリのサイズが162KiBなのでほとんど倍です。圧縮されて効率的なのは確かですが、ちょっと期待していた動作と違います。1行だけの変更なので、もう少し小さなサイズになることを期待していました。

Gitは、コンテンツの変更の際も単純にリポジトリに新しいオブジェクトとして追加します。これは高速に動作しますが、ディスク容量の観点からは非効率です。差分を探して、不必要なオブジェクトを削除するにはgit gcコマンドを使います。

リポジトリのサイズは78KiBと十分に小さくなりました。一つ目のファイルを追加した際のサイズより小さくなっています。

git gcコマンドは上記のように手動で実行することもできますが、必要と考えられるときやリモートリポジトリへのpushを行う時には自動で実行されます。

それではバイナリファイルの実験に入りましょう。リポジトリを初期化して開始します。

Gitはファイルをバイナリ(binfile)として認識してくれました。binfileは9.5MiBと大きなファイルですが、繰り返しが多いのでzlibによる圧縮が効率的に行えそうです。リポジトリのファイルは66KiBと期待通り小さなものになりました。

一部を改変するとどうなるでしょうか。

binfileに16バイトのわずかな変更を加えました。git gcを行うとリポジトリのサイズは35KiBとなりました。バイナリファイルでも差分による圧縮とzlib圧縮を行なって効率的にリポジトリにファイルが格納されることがわかりました。