Bitbucket + EGit^6

開発演習では、コーディング・テストが実質1週間位しかないので、各メンバーがmasterを直接修正してプッシュする方式でいい気がする。おそらくコンフクリクトが多発してその解消で手一杯になるだろうけど、目的である「ソース共有」はできるようになる。

ただgitに慣れてコンフリクトが減ってきたら、ブランチを取り入れるのもアリ。プルリクエストまでやるかどうかわからないけど、さすがに実務でもブランチは使うだろうし。しかしブランチの考え方とか、ブランチの粒度をどうするかは?ケースバイケースな気がする。

開発演習でブランチを取り入れるなら、開発作業を各メンバーでクローズできる範囲かつ半日~1日以内で終わりそうな粒度に分割して、それをブランチにするか?たとえば

  • xxxDAOにyyy()メソッドを追加する
  • xxx画面にBootstrapを適用する
  • XXXサーブレットにログインチェックのコードを追加する

位がいいのでは?その判断は各チームで考えてもらうとして、ここにはブランチを使った開発の手順を記載する。流れとしては以下のようになる。

# 作業項目 備考
1 ブランチの作成・切り替え
2 ソースコードの編集・テスト・コミット ここではプッシュしない
3 マージ プッシュはこの中で行う
4 ブランチ削除

1. ブランチの作成・切り替え


まず最初の状態を確認する。Gitプロパティのヒストリータブをみると以下のようになっている(何も表示されていないときは、プロジェクト名 右クリック > [表示(W)] > [ヒストリー]を選択)。

f:id:kktworks:20190627194937p:plain

先頭行にmaster, origin/master, HEADが表示されているから、これが最新だということがわかる。

master
デフォルトのブランチ名
origin/master
originはリモートリポジトリのこと。origin/masterは、リモートにプルされているmasterブランチのこと。
HEAD
作業しているブランチの先頭

ではprocyonさんが「ItemDao.javaへsave()メソッドを実装する」作業をするためのブランチとして「save()_impl」を作るとしよう。手順は以下の通り。

JavaEEパースペクティブのプロジェクトエクスプローラプロジェクト名 右クリック > [チーム(E)] > [切り替え(W)] > [新規ブランチ(N)]を選択。

f:id:kktworks:20190627195440p:plain

ブランチ作成ダイアログに以下を入力し、[完了(F)]クリック。

  • ブランチ名:save()_impl
  • プッシュおよびプルのアップストリームを構成する:クリア
  • 新規ブランチをチェックアウトする:チェック

f:id:kktworks:20190627195559p:plain

プロジェクト名の右側に切り替わったブランチ名(=save()_impl)が表示される。

f:id:kktworks:20190627195654p:plain

もし切り替わっていなければ、「新規ブランチをチェックアウトする」のチェックし忘れと思われる。その場合は、下記「4. ブランチ削除」でブランチを削除してやり直すか、以下のようにプロジェクト名 右クリック > [チーム(E)] > [切り替え(W)] > [ブランチ名]を選択してやる(=チェックアウト操作)。

f:id:kktworks:20190627201335p:plain

ここでヒストリータブを見ると、先頭行に作成したブランチも(=save()_impl)が表示されることがわかる。つまりこの段階では、 作成したブランチはmasterと同じ内容、ということになる。

f:id:kktworks:20190627200032p:plain

2. ソースコードの編集・テスト→コミット


ソースコードを編集して、テストで意図したとおりになっていることを確認したらコミットまでする。ここではプッシュしないので注意。 f:id:kktworks:20190627200324p:plain

ヒストリータブを見ると、masterとsave()_implが分かれたことがわかる。

f:id:kktworks:20190627201956p:plain

次のマージではブランチの内容をmasterへ取り込み(=マージ)、それをorigin/masterへ反映(プッシュ)する。

3. マージ


まず、操作対象を「変更を取り込む側のブランチ(=master)」へ切り替える。 プロジェクト名 右クリック > [チーム(E)] > [切り替え(W)...] > [master]を選択。

f:id:kktworks:20190627200525p:plain

プロジェクトの右側を見ると切り替わったことが確認できる。

f:id:kktworks:20190627200631p:plain

次にマージするブランチ(=save()_impl)を選択する。

プロジェクト名 右クリック > [チーム(E)] > [マージ(M)...]を選択。

f:id:kktworks:20190627200739p:plain

ローカルのsave()_implをクリックして、[マージ(M)]

f:id:kktworks:20190627200851p:plain

マージ成功。

f:id:kktworks:20190627200946p:plain

プロジェクトの右側を見ると↑1と表示されており、リモートに送っていない変更が1件あることがわかる。

f:id:kktworks:20190627201029p:plain

ヒストリータブを見ると、masterとsave()_impleの内容が一致したけど、origin/masterとは異なっていることがわかる。

f:id:kktworks:20190627202153p:plain

次にmasterの内容をリモートリポジトリ(=origin/master)へ以下の操作で反映する。

プロジェクト名 右クリック > [チーム(E)] > [アップストリームへプッシュ(P)]を選択。

f:id:kktworks:20190627201048p:plain

これでブランチで作業した内容がリモートリポジトリへ反映できた。

ヒストリタブをみると、master, save()_impl, origin/master, HEADが先頭行に表示されている。このうちリモートリポジトリへ作業内容を反映できたら、そのブランチは不要なので削除する。 f:id:kktworks:20190627201137p:plain

4. ブランチ削除


プロジェクト名 右クリック > [チーム(E)] > [拡張(V)] > [ブランチの削除(D)...]を選択。

f:id:kktworks:20190627201206p:plain

削除するブランチ(=save()_impl)を選択して、[OK]クリック。 f:id:kktworks:20190627201700p:plain

これでヒストリータブの先頭行は、最初と同じようにmaster, origin/master, HEADが表示されている。これで完了。

f:id:kktworks:20190627201758p:plain