デザイナー向けGit中級入門パート2(もうこわくないコンフリクト)
発生するシーン
ブランチを統合しようとして、同じファイルの同じ行の内容が統合する側とされる側でちがっていた場合にコンフリクトが起こります。
具体的にはブランチをmergeしたり、あるブランチをrebaseしてmasterブランチの最先端にコミットを移動させたり、rebaseして同じブランチ内のコミット同士をまとめたりする場合など、なんらかの形で「ファイルの統合」が発生するシーンにコンフリクトが起こりえます。
解消方法は3つだけ
コンフリクトが発生してもあわてないでください。マージの解消方法は結局以下の3つしかありません。
1. 「ファイルをいい感じに直す」
2. 「統合する側のファイルで上書きする」
3. 「統合される側のファイルで上書きする」
ファイルをいい感じに直す
まずは「ファイルをいい感じに直す」手順をご説明していきますね。
コンフリクトが発生すると、"git status"でこんな感じに表示されます。
$ git status
On branch staging
Your branch and 'origin/staging' have diverged,
and have 237 and 146 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Changes to be committed:
Unmerged paths:
(use "git add <file>..." to mark resolution)
both added: assets/javascripts/modules/hoge.js
ファイルを開くとこんな感じになっています。
<<<<<<< HEAD
this.Fields = ['hoge'];
=======
this.Fields = ['fuga'];
>>>>>>> e83b98ed8bdc8b6ad06cb4e84fd1f4ba110b9a8a
この「<<<<<<<とか=======とか>>>>>>>」をコンフリクトマーカーといいます。「<<<<<<<と>>>>>>>」でコンフリクトされている範囲がしめされ、「=======」の
上: 統合される側
下: 統合する側
の変更内容がそれぞれ表示されます。
※このとき、"git pull"の場合は「統合される側」がローカルリポジトリ、「統合する側」がリモートリポジトリということはわかりやすいと思うのですが、rebaseの場合など結構わかりづらいのでご注意ください。
このコンフリクトマーカーを頼りにファイルを編集してそのファイルを"git add"すれば、コンフリクト解消です!
(コンフリクトマーカー自体を消すのをお忘れなく)
どちらかのファイルで上書きしてしまう
「統合する側のファイルで上書きする」、「統合される側のファイルで上書きする」した方が良い場合(あと、一つ一つファイルを修正することにうんざりした場合も.......冗談です)はこちらを選択します。
手順は簡単。「統合する側のファイルで上書きする」場合は "git checkout --theirs [対象のファイルやディレクトリ]" を、「統合される側のファイルで上書きする」場合は "git checkout --ours [対象のファイルやディレクトリ]" を実行するだけです。念のため、意図したファイルが置き換わっていることが確認できたら、あとは同様にファイルを"git add"すればOKです。