2012年12月18日火曜日

EGit によるソースコード管理 (3) ブランチとマージ

以前のポスト「EGit によるソースコード管理(1) ローカルリポジトリの作成」で書いたように、私の場合、自宅、外出先、自宅、外出先・・・のように作業マシンは違っても、一人で同じプロジェクトを順に修正することが大部分なので、Eclipse での EGit の使い方はほとんど以下のような感じです:
  1. 新規プロジェクトを作成(New-PRJ1)
  2. 作成したプロジェクトからローカルリポジトリを作成(New-RIPO1)
  3. New-PRJ1 → add, commit → New-RIPO1
  4. 公開リポジトリ(Github または Dropbox リポジトリ(ベア))を準備 (PUB-RIPO1)
  5. ローカルリポジトリを公開リポジトリへプッシュ(New-RIPO1 → PUB-RIPO1)
  6. 別のユーザー(マシン)が公開リポジトリからクローンを作成 (PUB-RIPO1 → A-RIPO1, B-RIPO1, ...)
  7. A-RIPO1, B-RIPO1 で作業。公開リポジトリへのプッシュ、プルを繰り返す。
そのため、EGit の操作は add, commit, push, pull だけでもほとんど事が足りるのですが、実験的な機能の追加や、大規模なリファクタリング時に直接 master ブランチを修正するのは危険なので、ブランチとマージもよく使います。今回はEgit でのブランチとマージの使い方を説明します。

task1: 公開リポジトリの作成
すでに公開リポジトリ([Dropbox]/__git/egit/egittest.git) が作成されている状態から始めます。このリポジトリのプロジェクトは、以下のような内容の mainclass.txt を持つだけのものです:
mainclass {
    main1m1() {
    }
}

task2: (1)公開リポジトリからクローンを作成 (自宅PC)
リポジトリビューを表示して、ビューメニューの "Clone a Repository" を選択して、上述の公開リポジトリからクローンを作成します(クローン作成については「EGit によるソースコード管理(2) Dropbox にリポジトリを構築」を参照してください)。このとき、インポートされたプロジェクト(C:/_egit/egit/egittest/egittest) の内容は、初期公開プロジェクトの完全なコピーです(下図):


※:リモート名
クローン作成時にリモート名を設定できます(デフォルトは origin)。公開リポジトリを Dropbox に作成する場合に、例えばリモート名を dropbox にできます。

task2: (2) 実験用ブランチ sample1 を作成
リポジトリビューの egittest ノードを右クリックして、ポップアップ > Switch To > New Branch を選択します。

表示されたダイアログ(上図)で、ブランチ名に sample1 を入力して終了します。

task2: (3) subclass1.txt を追加
subclass1.txt を追加した後のローカルリポジトリと egittest プロジェクトの状態は以下のようになります。



テストと修正を繰り返して実験的な機能が完成したらコミットします。 コミット後のプロジェクトとローカルリポジトリの状態と履歴は以下のようになります:

task3: (1) master ブランチの修正(ノートPC)
同じ自宅PCで、上記の状態から master ブランチに戻るには、 egittest リポジトリを右クリックして、ポップアップ > Switch To > master を選択すれば良いのですが、この作業は外出用のノートPCで行う事にします。この場合ノートPCのリポジトリビューでビューメニューの "Clone a Repository"  を選択します:
表示されたウィザード(上図)で、URI を選択して、Next を押します:


次のページで、URIとして、上述の公開リポジトリを指定して、Next:
必要なブランチは master だけなので、master だけチェックして(上図)、次のページへ移ります。

次のページではクローンを作成するディレクトリを指定して、オプションの"Import all existing projects after clone finishes" をチェックして終了します。 この後のローカルリポジトリと、インポートされたプロジェクトの状態は以下のようになります:

task3: (2) mainclass に main1m2() を追加する
mainclass.txt を修正して、main1m2() を追加してコミットおよびアップストリームへのプッシュを行った後のプロジェクトとリポジトリ、履歴の状態は以下のように変わります:


task4: (1) master と sample1 をマージ (自宅PC)
再び自宅PCで作業を行います。 自宅PCで、ブランチを master に切り替え、公開リポジトリからプルした状態は、ノートPCの最後の状態と同じです。この状態で、リポジトリビューの egittest を右クリックして、ポップアップ > Merge... を選択します。次のダイアログが表示されます:


sample 1を選択して、Merge ボタンを押します。次の結果確認のダイアログが表示されます:


マージ後のプロジェクトとローカルリポジトリ、履歴の状態は次のようになります:

HEADは、sample1 をマージした masterブランチを指します。 アップストリームへプッシュすると、orgin/master にもマージが反映されます。 不要になった sample1 ブランチを削除したい場合は、リポジトリビューで egittest/Branches/Local/sample1 を選択してポップアップ > Delete Branch を選択することができます。

0 件のコメント: