プルリクエストでコンフリクトしたときの対処方法(備忘録)

チームで 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 を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら

>> Twitter をフォローする

 

-環境構築