git が使いにくいのはコマンド設計の悪さの他、レポジトリの状態と自分の位置を確認するのが難しいからだと思います。例えば Subversion ならある瞬間のファイルはパス名とリビジョン番号で一意に定まるので、時間的、空間的位置を把握するのは簡単です。しかし git ではそこにブランチが加り、ファイルは SHA1 という恐ろしい記法で管理されます。そこで色々試してみて git show-branch を活用するするとだいぶ理解しやすくなる事が分かりました。
本来の git show-branch の役割は、複数のブランチやタグが分岐してから現在までの記録を表示する事です。例えばたまたま手元で仕事中のブランチ bui-test と master、そして タグ idst-r612-merged を比較するとこんな風になります。ブランチ名を指定しないとローカルのブランチを全部指定したのと同じになります。
$ git show-branch bui-test master idst-r612-merged * [bui-test] bui: ported paintTest ! [master] bui: paint save button ! [idst-r612-merged] Merge branch 'master' of ssh://hoge.org/git/idst --- + [master] bui: paint save button + [master^] bui: port paintTest + [master~2] bui: copied paintTest from mui * [bui-test] bui: ported paintTest * [bui-test^] bui: copyed paintTest.st from mui * [bui-test~2] bui: disable Gezira for testing *+ [master~3] remove ifNil:ifNotNil: bugfix --- [idst-r612-merged] Merge branch 'master' of ssh://hoge.org/git/idst
出力の読み方は次の通りです。
- 全体の構成
- 最初の何行かはブランチやタグの最新情報が表示
- 残りはブランチが分岐してから現在までの記録
- それぞれの意味
- 行頭の * は現在自分が居るブランチ。たとえば一文字目に * があると、一つ目のブランチ、上の例では bui-test に属しているという意味。
- 行頭の ! はその他の最新(HEAD)
- 行頭の + はその行が属するブランチ。
- 行頭の - はその文字があるブランチでマージが行われた事。上の例では最終行に三つ - があるので、三つのブランチ(とタグ)がそこでマージされている。
- 行頭の [] の中身は short name。SHA1 の代わりにコミット(記録) を指定するのに使う。
- 行の残りはコミットログ。
特に short name が表示されるのが便利で、diff を取るのに重宝します。short name というのは SHA1 の代わりにコミットを指定する名前で、git-rev-parse(1) に詳しい説明があります。例えば以下のようにすると "bui: copyed paintTest.st from mui" でどんな変更をしたか分かります。
$ git show bui-test^
ただ、残念ながら short-name は HEAD からの相対位置なので、今後 bui-test ブランチにさらに変更を加えると変わってしまいます。後で何度も参考にするようなら git tag でタグを作っておくと便利かも。
$ git tag add-paintTest bui-test^ # タグ add-paintTest を追加 $ git show add-paintTest $ git tag -d add-paintTest # 要らなくなったらタグ add-paintTest を削除
このように git show-branch は表示もコンパクトで short name も表示されて大変便利なのですが、ブランチが分岐されてからの履歴しか出ないのでそのままでは git log の代わりにはなりません。--more=行数 オプションで、さらに分岐される以前のログも見えるようになります。
$ git show-branch --more=100 master