gitのブランチに慣れる

subversionと違い、gitはブランチ/マージを積極的に利用することが推奨されています。
簡単なサンプルシナリオで、ブランチを使った開発に慣れたいと思います。

## シナリオ

### 環境

一複数箇所をシュミレーションするため、二カ所のワーキングスペースを持つ。

### 作業手順

1. 下準備(app.gitをcloneしてapp1・app2を作成)

2. メンバ1: ブランチfirstを作成
3. メンバ1: a.txtを編集してcommit
4. メンバ1: firstをmasterにmerge、push

5. メンバ2: ブランチsecondを作成
6. メンバ2: a.txtを編集してcommit
7. メンバ2: secondをmasterにmerge、a.txtのコンフリクトを解決し、commit、push

## 作業

### 1. 下準備(app.gitをcloneしてapp1・app2を作成)
/var/src% mkdir app.git
/var/src% cd app.git
/var/src/app.git% git init --bare --share
Initialized empty shared Git repository in /private/var/src/app.git/
/var/src/app.git% git config --global user.name 'qnzm'
/var/src/app.git% git config --global user.email 'qnzm@gmail.com'
/var/src/app.git% git config --global core.editor vim            
/var/src/app.git% git config --global color.ui auto  
/var/src/app.git% cd ..
/var/src% git clone /var/src/app.git app1
Cloning into app1...
done.
warning: You appear to have cloned an empty repository.
/var/src% git clone /var/src/app.git app2
Cloning into app2...
done.
warning: You appear to have cloned an empty repository.

/var/src/app1% echo aaaaa >a.txt     
/var/src/app1% git add -A    
/var/src/app1% git commit -m "first
/var/src/app1% git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 202 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /var/src/app.git
 * [new branch]      master -> master

/var/src/app1% cd ..     
/var/src% git clone /var/src/app.git app2
Cloning into app2...
done.
### 2. メンバ1: ブランチfirstを作成
/var/src% cd app1
/var/src/app1% git checkout -b first
Switched to a new branch 'first'
/var/src/app1% git branch
* first
  master
### 3. メンバ1: a.txtを編集してcommit
/var/src/app1% echo bbbbbccccc >>a.txt 
/var/src/app1% cat a.txt 
aaaaa
bbbbbccccc
/var/src/app1% git add -A
/var/src/app1% git commit -m "add bbbbbccccc"
[first efd1a02] add bbbbbccccc
 1 files changed, 1 insertions(+), 0 deletions(-)
### 4. メンバ1: firstをmasterにmerge、push
/var/src/app1% git checkout master
Switched to branch 'master'
/var/src/app1% git branch 
  first
* master
/var/src/app1% git merge first
Updating d149748..efd1a02
Fast-forward
 a.txt |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
### 5. メンバ2: ブランチsecondを作成
/var/src/app1% cd ../app2
/var/src/app2% git checkout -b second
Switched to a new branch 'second'
### 6. メンバ2: a.txtを編集しcommit
/var/src/app2% cat a.txt 
aaaaa
/var/src/app2% echo ddddd >>a.txt 
/var/src/app2% sed s/a/e/g a.txt
eeeee
ddddd
/var/src/app2% git add -A
/var/src/app2% git commit -m "second"
[second e10a7cd] second
 1 files changed, 1 insertions(+), 0 deletions(-)
### 7. メンバ2: secondをmasterにmerge、a.txtのコンフリクトを解決、push
/var/src/app2% git checkout master 
Switched to branch 'master'
/var/src/app2% git pull        
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /var/src/app
   d149748..efd1a02  master     -> origin/master
Updating d149748..efd1a02
Fast-forward
 a.txt |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
/var/src/app2% git merge second
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.
/var/src/app2% cat a.txt 
aaaaa
<<<<<<< HEAD
bbbbbccccc
=======
ddddd
>>>>>>> second

a.txtを編集。

aaaaa
bbbbbccccc
ddddd

commit、push。

/var/src/app2% git commit -a -m "コンフリクトを解決"
[master 254ed11] コンフリクトを解決
/var/src/app2% git push
Counting objects: 10, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (6/6), 507 bytes, done.
Total 6 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
To /var/src/app.git
   efd1a02..254ed11  master -> master