チームで Git を使って開発を進めていると、どうしてもコンフリクトを発生させてしまいます。
コンフリクトの処理は Git の仕様を理解していないと非常に時間がかかったりします。
まして、うっかり対処をミスすると自体はさらに悪化します。
今回はコンフリクトを発生させても、冷静に対応できるように備忘録としてエントリーします。
状況
【 私 】master ブランチから分岐した feature/mybranch で作業をし、実装完了したのでプッシュ⇒プルリクエスト
【 Aさん 】だが、少し前に同じファイルを feature/theirbranch で編集しプルリクエスト
【 リポジトリ管理者 】先にプルリクエストのあった feature/theirbranch をmaster ブランチにマージ
この状況下で feature/mybranch のプルリクエストをmaster にマージしようとすると「競合の警告」が出てマージできない状態になります。
いわゆる「コンフリクト」の発生ですね。
手順
1)コンフリクト箇所の確認する
2)master の最新化
3)mybranch をマージ
4)必要箇所を修正する
5)プッシュ・プルリクエスト
6)結果確認
1)コンフリクト箇所の確認する
まずは状況確認。プルリクエストを見て競合の状態を見ます。
今回は Laravel の routes.php のファイルに「私」「Aさん」各々が設定を書き加えたのが競合の原因だとわかります。
実際によくあるケースです。プルリクエストを確認すると以下のような画面になります。
2)master の最新化
それでは今からコンフリクトのファイルを改修していきます。
コンフリクトによる修正作業はローカルでやります。
1.master ブランチに移動
git checkout master
2.リモートリポジトリの master ブランチの最新状態を取り込む
git pull origin master
3)mybranch をマージ
1.feature/mybranch に移動
git checkout feature/mybranch
2.master ブランチをマージ
git merge master
3.競合の警告が表示される
以下のような画面が表示されます。
4)必要箇所を修正する
1.エラーメッセージで「app/Http/routes.php」にコンフリクトが発生していると出ています。
2.routes.php を開いて、処理内容を見ます。
theirbranch と mybranch 両方の変更を取り込みます。
「/<<<」でコンフリクト箇所を検索。
<<<<<<< HEAD
自分の環境の変更点
=======
マージを試みた他の環境での変更点
>>>>>>> [commit id]
このとき、自分の環境の変更点を優先してはいけません。
理由があって変更されていると思われるので内容を確認の上、修正を行います。
今回は、両方の変更を取り込むようにします。
3.このあとは通常どおりにインデックスに追加してコミットメッセージを入力してコミットします。
5)プッシュ・プルリクエスト
1.コミットできたら mybranchをプッシュします。
git push origin feature/mybranch
6)結果確認
もう一度、feature/mybranch を master にマージしてみます。
まずは、コンフリクトが解決したかリモートリポジトリのプルリクエストを確認します。
今度は警告マークがなく master にマージできます。
ブランチフローはこんな感じ。
コンフリクトが発生したら参考にしてみてください。
以上です。
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。