コンフリクトとは
チームで開発をしている時に同じファイルの変更箇所が重複した時に起こることを
conflict(衝突)と言います。
コンフリクトの解消方法
1.git rebase
ブランチ元のポイントを変えていきます。
2.git merge
マージ先のブランチを違う方向にマージして解消します。こっちの方が簡単です。
git mergeを使った解消法
まずはわざとコンフリクトを発生させていきます。
- ブランチを作成
まずはdvelopブランチの状態です。
1 //このリポジトリはテスト
2 テストするぞ
3 いえー
ブランチを作成します。 feature/green、feature/redを作ります。
training-git % git branch
* develop
feature/green
feature/red
master
それぞれのブランチで以下のように作業をしてそれぞれのブランチでプルリクをだします。
feature/green
を
1//テストするぞ
2コンフリクトを起こすぞ!
3コンフリクトだ!
feature/red
を
1//このリポジトリはテスト
2conflict
3いやだー
にします。
するとプルリクを出すと下のような表示が出ます。これがconflictが起きている画面です。
それでは解決をしていきます。
まずはdevelopブランチに移動します。その後pullします。
training-git % git checkout develop
Switched to branch 'develop'
training-git % git pull origin develop
#省略
branch develop -> FETCH_HEAD
27b30e0..51fba42 develop -> origin/develop
Updating 27b30e0..51fba42
Fast-forward
test | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
そしてfeature/greenに移動してdevelopブランチにgit mergeします。
training-git % git checkout feature/green
Switched to branch 'feature/green'
training-git % git merge develop
Auto-merging test
CONFLICT (content): Merge conflict in test
Automatic merge failed; fix conflicts and then commit the result.
するとこんな感じの画面になります。
上に 現在の変更を取り込む、入力側の変更を取り込む、両方の変更を取り込む、現在の変更を取り込む
と表示されています。今は日本語設定になっていますが、英語設定だと表示が変わってきます。
英語だとAcceptCurrentChange、AcceptIncomingChange、
AcceptBothChanges、CompareChanges
と表示されます。
現在の変更を取り込むだとfeature/greenブランチにいるのでfeature/greenの内容が反映されます。
ctrl + z
で元に戻ります。
入力側の変更を取り込むだとfeature/redブランチの内容が反映されます。
両方の変更を取り込む
と2つのブランチの内容が反映されます。
変更の比較を押すと下のようになります。
今回は両方を取り込みました。feature/greenブランチから
training-git % git add .
training-git % git commit -m "コンフリクト解消"
training-git % git push origin feature/green
でpushした後GitHubを確認するとコンフリクトが解消されていました。
まとめ
かなり簡単な内容ですが大事なので参考にしてみてください。
資料