Gitを使ってコンフリクトを試す
※Git version 1.7.4.1 で試しました。
資料はPro Gitを参考にまとめました。
master ブランチのみでコンフリクトしてみる
- 同じファイルに変更がかかっているとpullは出来ない
% git pull remote: Counting objects: 4, done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From gkan:gittest c90d273..c3a0c18 master -> origin/master Updating c90d273..c3a0c18 error: The following untracked working tree files would be overwritten by merge: config.yml Please move or remove them before you can merge. Aborting
- ローカルのリポジトリにコミットするとpullできる。pullすると勝手にmergeされる
% git commit -am 'change config.yml' [master 0d9553e] change config.yml 1 files changed, 2 insertions(+), 0 deletions(-) create mode 100644 config.yml % git pull Auto-merging config.yml CONFLICT (add/add): Merge conflict in config.yml Automatic merge failed; fix conflicts and then commit the result. // 中身 % cat config.yml <<<<<<< HEAD hage hage ======= hoge hoge hoge >>>>>>> c3a0c186114523678443d95a62c97c1b8763a503 // 修正する % git mergetool % git commit -am 'conflict config.yml fix' % git push
○考察
これがsubversionの場合 $ svn update でコンフリクトするとファイルが消滅する可能性があるがcommitしているので消える心配はない。
以下はその確認。
% git show c3a0c186114523678443d95a62c97c1b8763a503:config.yml hoge hoge hoge % git show 5fde2874f852ba978e96a51c302395e842aee0c0:config.yml hage hage
ローカルブランチを用意してコンフリクトしてみる
- ブランチdevを作成して、masterで変更内容を取得
% git checkout -b dev Switched to a new branch 'dev' // 変更してcommit % vi config.yml % git commit -am 'change config.yml' [dev 1d9b4d1] change config.yml 1 files changed, 2 insertions(+), 0 deletions(-) // masterに切替て変更内容取得 % git checkout master Switched to branch 'master' % git pull remote: Counting objects: 5, done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From gkan:gittest 5fde287..ce03373 master -> origin/master Updating 5fde287..ce03373 Fast-forward config.yml | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
- masterのブランチにdevの内容を反映するとコンフリクトになる
% git merge dev Auto-merging config.yml CONFLICT (content): Merge conflict in config.yml Automatic merge failed; fix conflicts and then commit the result. // conflictを修正してリモートのリポジトリに反映 % git mergetool % git commit -am 'conflict config.yml fix' [master 5d09e4e] conflict config.yml fix % git push Counting objects: 10, done. // dev に切替 % git checkout dev Switched to branch 'dev' // mergeするとmasterを真として適用された % git merge master Updating 1d9b4d1..5d09e4e Fast-forward config.yml | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
○考察
本番サイトはreleaseタグを切って運用となるが、リリースブランチを開発者以外が直接触ることから、ローカルブランチを分けて変更内容をmasterに反映とする
リリースブランチの作成と切替
- ローカル
// リリースブランチ作成して、新しいブランチに切替 % git checkout -b iss1 % git commit -am 'release iss1' % git push origin iss1
- 本番環境
// リモートリポジトリ取得 % git fetch // リモートリポジトリ確認 % git branch -r origin/HEAD -> origin/master origin/iss1 origin/master % git checkout --track origin/iss1 % git branch * iss1 master
- 不要になったリモートブランチを削除(※利用には注意)
% git push origin :iss1