master/develop ブランチなモデル

ええと、A successful Git branching model なんですが、release branch なナニが若干微妙。

  • release branch は develop から作成される
  • develop と master に merge される

手順として

branch off して云々
$ git checkout -b release-1.2 develop
Switched to a new branch "release-1.2"
$ ./bump-version.sh 1.2
Files modified successfully, version bumped to 1.2.
$ git commit -a -m "Bumped version number to 1.2"
[release-1.2 74d9424] Bumped version number to 1.2
1 files changed, 1 insertions(+), 1 deletions(-)
commit したら master に merge
$ git checkout master
Switched to branch 'master'
$ git merge --no-ff release-1.2
Merge made by recursive.
(Summary of changes)
$ git tag -a 1.2
develop 方面へも同様に盛り込み
$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff release-1.2
Merge made by recursive.
(Summary of changes)

という流れなのはさくっと理解できるんですが、元が develop な branch を master に merge する、というのは問題ないのだろうか。

という事で

簡単に試験してみます。手順としては以下かな。Android のハロワにするかどうするか。

  • リモートリポジトリのガワを作成
  • ローカルリポジトリ作成して origin/master に push
    • git add して commit してリモートに push
  • master から develop ブランチを作って origin/develop に push
  • clone し直して origin/develop を checkout
    • git checkout -t -b develop origin/develop
  • ここから develop ブランチを育てる
  • どこかのタイミングで develop 発の release-1.0 なブランチを作る
    • 適当に育てる
  • master に merge してみてどうなるか
    • よくよく考えてみるに、上記の状態であれば祖先は master だからなぁ。。。
    • でも release な branch は必ず master にも develop にも merge される、というルールなのであれば問題無いのかなぁ

試験

どっかに作った痕跡が無いかなぁ、と探してみたら github 方面にありました。

$ git clone git@github.com:yamanetoshi/Android-Exercise.git
Cloning into Android-Exercise...
Enter passphrase for key '/Users/tyamane/.ssh/id_rsa': 
remote: Counting objects: 39, done.
remote: Compressing objects: 100% (21/21), done.
remote: Total 39 (delta 5), reused 0 (delta 0)
Receiving objects: 100% (39/39), 12.36 KiB, done.
Resolving deltas: 100% (5/5), done.
$ cd Android-Exercise
$ git branch
* master
$ git checkout -t -b develop origin/develop
Branch develop set up to track remote branch develop from origin.
Switched to a new branch 'develop'
$ git branch
* develop
  master
$

で、いきなり release なブランチ作るか。

$ git checkout -b release-1.0 
Switched to a new branch 'release-1.0'
$ git branch
  develop
  master
* release-1.0
$

で、いくつか commit したいので少しづつ。まず TextView を Button にする。

$ git diff
diff --git a/res/layout/main.xml b/res/layout/main.xml
index 3a5f117..dcddcd7 100644
--- a/res/layout/main.xml
+++ b/res/layout/main.xml
@@ -4,7 +4,8 @@
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     >
-<TextView  
+<Button
+    android:id="@+id/button"
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello"
$

これで、add して commit します。ちなみにこの release なブランチは一人で対応してるの前提って事で branch したり merge したりは略します。

$ git add res/layout/main.xml
$ git commit -m 'TextView to Button'
[release-1.0 ec575b4] TextView to Button
 1 files changed, 2 insertions(+), 1 deletions(-)
$

で、ボタンなソレを盛り込んでみました。

$ git diff
diff --git a/src/jp/shuri/yamanetoshi/androidexercise/AndroidExercise.java b/src/jp/shuri/yamanetoshi/androidexercise/AndroidEx
index d461930..998040b 100644
--- a/src/jp/shuri/yamanetoshi/androidexercise/AndroidExercise.java
+++ b/src/jp/shuri/yamanetoshi/androidexercise/AndroidExercise.java
@@ -3,6 +3,9 @@ package jp.shuri.yamanetoshi.androidexercise;
 import android.app.Activity;
 import android.os.Bundle;
 import android.webkit.WebView;
+import android.widget.Button;
+import android.view.View.OnClickListener;
+import android.widget.Toast;
 
 public class AndroidExercise extends Activity {
     /** Called when the activity is first created. */
@@ -13,5 +16,14 @@ public class AndroidExercise extends Activity {
        webView.getSettings().setJavaScriptEnabled(true);
        webView.loadUrl("file:///android_asset/index.html");
        setContentView(webView);
+
+               Button btn = (Button)findViewById(R.id.button);
+        btn.setOnClickListener(new OnClickListener() {
+
+                       @Override
+                       public void onClick(View v) {
+                               Toast.makeText(AndroidExercise.this, "test", Toast.LENGTH_SHORT).show();
+            }
+               });
     }
 }
\ No newline at end of file
$

動くかどうかは知りませんが、commit して merge してみる。

$ git add src/jp/shuri/yamanetoshi/androidexercise/AndroidExercise.java
$ git commit -m 'modify AndroidExercise.java'
[release-1.0 acb1bd7] modify AndroidExercise.java
 1 files changed, 12 insertions(+), 0 deletions(-)
$

で、merge してみます。

$ git branch
  develop
  master
* release-1.0
$ git checkout master
Switched to branch 'master'
$ git merge release-1.0
Updating 172e974..acb1bd7
Fast-forward
 .classpath                                         |    2 +-
 AndroidManifest.xml                                |    3 +-
 assets/index.html                                  |   22 ++++++++++++++++++++
 res/layout/main.xml                                |    3 +-
 .../androidexercise/AndroidExercise.java           |   18 +++++++++++++++-
 5 files changed, 43 insertions(+), 5 deletions(-)
 create mode 100644 assets/index.html
$

しまった。fast forward されたorz
でも master ブランチに merge は可能な事が確認できますた。

やり直してみる

ええと、以下かな。

$ git log --graph
* commit acb1bd70d64af49933d9c11ccabbed578c6bb791
| Author: Toshiaki Yamane <t.yamane@lexues.co.jp>
| Date:   Tue Jan 11 20:29:20 2011 +0900
| 
|     modify AndroidExercise.java
|  
* commit ec575b44de746bc55909daf56a1c67bcfeca6be3
| Author: Toshiaki Yamane <t.yamane@lexues.co.jp>
| Date:   Tue Jan 11 20:20:08 2011 +0900
| 
|     TextView to Button
|  
* commit de7c9413fdff86cfad8219b62629d3cf75fee6ad
| Author: rms <yamanetoshi@gmail.com>
| Date:   Tue May 4 17:29:00 2010 +0900
| 
|     implement google map
|  
* commit 1698143ad4df120af3afe04d4b46e8bbd16cab3a
| Author: rms <yamanetoshi@gmail.com>
| Date:   Tue May 4 16:51:47 2010 +0900
| 
|     modify .classpath by eclipse
|  
* commit 172e974076a3df81360e47015c504bc1dbab5e0e
  Author: rms <yamanetoshi@gmail.com>
  Date:   Tue May 4 16:36:35 2010 +0900
  
      first commit
$ git reset --hard HEAD~2
HEAD is now at de7c941 implement google map
$

戻ったので再度 merge してみます。

$ git merge --no-ff release-1.0
Merge made by recursive.
 res/layout/main.xml                                |    3 ++-
 .../androidexercise/AndroidExercise.java           |   12 ++++++++++++
 2 files changed, 14 insertions(+), 1 deletions(-)
$

を、なんとなく良いカンジ。

$ git log --graph
*   commit c117639ee3d6eaaf7687a355d72ead8e89e6f604
|\  Merge: de7c941 acb1bd7
| | Author: Toshiaki Yamane <t.yamane@lexues.co.jp>
| | Date:   Tue Jan 11 20:35:45 2011 +0900
| | 
| |     Merge branch 'release-1.0'
| |   
| * commit acb1bd70d64af49933d9c11ccabbed578c6bb791
| | Author: Toshiaki Yamane <t.yamane@lexues.co.jp>
| | Date:   Tue Jan 11 20:29:20 2011 +0900
| | 
| |     modify AndroidExercise.java
| |   
| * commit ec575b44de746bc55909daf56a1c67bcfeca6be3
|/  Author: Toshiaki Yamane <t.yamane@lexues.co.jp>
|   Date:   Tue Jan 11 20:20:08 2011 +0900
|   
|       TextView to Button
|  
* commit de7c9413fdff86cfad8219b62629d3cf75fee6ad
| Author: rms <yamanetoshi@gmail.com>
| Date:   Tue May 4 17:29:00 2010 +0900
| 
|     implement google map
|  
* commit 1698143ad4df120af3afe04d4b46e8bbd16cab3a
| Author: rms <yamanetoshi@gmail.com>
| Date:   Tue May 4 16:51:47 2010 +0900
| 
|     modify .classpath by eclipse
|  
* commit 172e974076a3df81360e47015c504bc1dbab5e0e
  Author: rms <yamanetoshi@gmail.com>
  Date:   Tue May 4 16:36:35 2010 +0900
  
      first commit
$

こゆ事してると何か作りたくなってきますな。Git がモチベーションの源とゆーのも微妙なので、スマホをげとしたら自分アプリをこつこつ作ろう、と思ってます。ふふふふ。