オレ的Vimperator最新リポジトリを追っかけるGitの使い方

いままで git-clone と git-pull しか使ったことが無かったので、そろそろちゃんとGitの使い方を理解したいなーと思い、「Vimperatorの最新版の追っかけ」を題材に手順をまとめてみた。

ローカルに公開リポジトリのクローンを作る

まずは、公開されているリポジトリのクローンをローカルに作る。
以下のようにコマンドを打つ

git clone git://vimperator.org/liberator.git

firewall等でgit:プロトコルが通らない場合はhttp:で

git clone http://git.vimperator.org/liberator.git

本家リポジトリの変更点をローカルに反映する

で、しばらくすると本家のリポジトリ(クローン元)にバグ修正とか機能追加とかがあるので、それをローカルのリポジトリおよび作業ディレクトリに反映することになる。
変更点とかあまり気にしない場合は単純に

git pull

でもいい、でもそうした場合、前回取得した時点からの変更点をさがすのが面倒(日付とかを基準に判断することになる)ので 変更点をひとつづつ確認したい場合は以下ような手順になる。
まず、git-fetchコマンドを実行

git fetch origin

これでクローン元のリポジトリの変更点がローカルのリモート追跡用リポジトリに反映される。
上記の'origin'とはリモート追跡用のリポジトリに付けられた名前。
この名前はgit-remoteコマンドで追加/変更ができるが、リモートのリポジトリをcloneした場合、自動的にクローン元のリポジトリに対して'origin'という名前が付けられる。
念のため、リモート追跡用リポジトリの一覧は以下のコマンドで確認できる。

git remote show

git-fetchコマンドの実行例は以下のような感じ。

$ git fetch origin
got 6f249e4f75b84de75b086a2a325ad56e5ad604d0
walk 6f249e4f75b84de75b086a2a325ad56e5ad604d0
got 73e04bde2d3bcffc5cd7b602f766ebc4de5ecdf6
got cf4f6a04c495590500bf6498120224b658fb77a0
   :
got 46f300121cd359f607e580ba91e42dbd932ce7e0
got 622111689b68c4c0ad286fb0f8478a821cee14bf
From http://git.vimperator.org/liberator
   b4d95ba..6f249e4  master     -> origin/master

前回からの変更点を確認する

これで、リモート追跡用リポジトリが最新化された。
ただし、このままの状態ではローカルのリポジトリ自身にはリモートの変更点は反映されていない。
この状態で現在のローカルリポジトリの内容とリモート追跡用リポジトリの内容を比較することで、前回からの変更点確認することができる。
変更の確認にはgit-logコマンドを使う。

git log --stat --summary  master..origin/master

上記のコマンドはローカルの'master'ブランチ以降に発生した、リモート追跡用リポジトリ'origin'の'master'ブランチの変更点を出力する。
'master'ブランチとはCVSSVNで言うところのトランク(trunk)に相当するもの。Gitではトランクとブランチを区別せず、すべてブランチとして扱っていて、リポジトリを作成したときデフォルトで作成されるブランチが'master'ブランチ。
上記コマンドを実行すると以下のような結果が表示される。
上記のようにブランチ名を'A..B'という風に繋ぐと「Aに含まれていないBの変更点」のみを出力することになる。出力例は以下のような感じ。

commit 3803b0b105387fecc52a5b1878bc95699c16e4df
Author: Kris Maglione <maglione.k@gmail.com>
Date:   Mon Jan 12 13:54:10 2009 -0500

    Fix b34838e4b6fc54d42eebfcb4f20c26ee8e4db473

 common/content/completion.js |    3 +--
 1 files changed, 1 insertions(+), 2 deletions(-)

commit 6c172044ad48ffd0c7deaeb8125204a3df4a8e6a
Author: Ted Pavlic <ted@tedpavlic.com>
Date:   Mon Jan 12 10:47:33 2009 -0500

    .gitignore and Makefile cleanup to make build environment friendly (and non-biased) to other editors

 .gitignore             |   25 ++++++++++++++++++++++---
 Makefile               |    5 -----
 common/Makefile.common |    1 -
 common/Makefile.doc    |    1 -
 4 files changed, 22 insertions(+), 10 deletions(-)
  :

出力結果から 3803b0b... というコミットでcompletion.jsの変更、6c17204... というコミットで.gitignoreやMakefile関係の変更があったことが概観できる。
さらに変更点の詳細を見るにはgit-logコマンドのオプションを以下のように変更する。

git log -p  master..origin/master

こうするとパッチ形式ですべての変更点が確認できる。出力例は以下のとおり。

t cf4f6a04c495590500bf6498120224b658fb77a0
Author: Kris Maglione <maglione.k@gmail.com>
Date:   Tue Jan 13 19:23:35 2009 -0500

    Fix MOW bug

diff --git a/common/content/ui.js b/common/content/ui.js
index 8eb7cc3..f526b02 100644
--- a/common/content/ui.js
+++ b/common/content/ui.js
@@ -1648,7 +1648,7 @@ function CommandLine() //{{{
                 availableHeight = getBrowser().mPanelContainer ?
                     getBrowser().mPanelContainer.boxObject.height : getBrowser().boxObject.height;
                 if (!outputContainer.collapsed)
-                    availableHeight += outputContainer.height;
+                    availableHeight += parseFloat(outputContainer.height);
             }
             catch (e) {}
             doc.body.style.minWidth = commandlineWidget.scrollWidth + "px";

内容の確認が終わったらローカルのリポジトリにリモート追跡用リポジトリの変更点をマージする。
以下のようにgit-mergeコマンドを叩く。

git merge origin/masger

これで、ローカルのリポジトリ及び作業ディレクトリにクローン元(リモート)のリポジトリの変更内容が反映され最新化される。
次回からは git-fetchからgit-mergeの手順を繰り返す。