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