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