Gitでブランチをマージする際、マージ元とマージ先で同一ファイルの同一行を更新していた場合に、コンフリクト(衝突)が発生してしまう。今回は、コンフリクトが発生した場合に解決する手順をまとめてみたので、共有する。
前提条件
下記記事の手順を、リモートリポジトリ名=git-merge-resolve-conflictとして実行済であること。
また、下記記事の手順の「更新後ファイルをfeatureブランチにコミット」までの手順を、リモートリポジトリ名=git-merge-resolve-conflictとして実行済であること。
やってみたこと
リモートブランチの内容を更新
featureブランチをmasterブランチにマージした際にコンフリクトを発生させるため、リモートリポジトリのDemoControllerクラスの内容を更新する。その手順は以下の通り。
1) リモートリポジトリのDemoControllerクラスを表示し、編集(Edit this file)ボタンを押下する。
2) 以下の赤枠部分のソースコードを編集し、コミットメッセージを記載し、「Commit changes」ボタンを押下する。
マージによるコンフリクトの発生
リモートリポジトリの内容を取得し、featureブランチの内容をmasterブランチにマージすると、コンフリクトが発生する。その手順は以下の通り。
1) 「git checkout (変更後ブランチ名)」というコマンドで、masterブランチに変更する。変更前後のブランチは「git branch」コマンドで確認する。
2) リモートリポジトリが更新されているので、「git pull (リモート名) (ブランチ名)」を実行し、リモートリポジトリの更新内容をローカルに反映する。
3) 「git merge (マージ元ブランチ名)」というコマンドで、featureブランチの更新内容を、元の(master)ブランチに反映させようとすると、DemoControllerクラスでコンフリクトが発生したことが確認できる。
4) コンフリクトが発生したDemoControllerクラスの内容は以下の通りで、赤枠の部分でコンフリクトが発生することが確認できる。
コンフリクトの解消
コンフリクトの解消手順は以下の通りで、コンフリクトが発生したファイルを編集後、git add⇒git commitの順に対応すればよい。
1) コンフリクトが発生したDemoControllerクラスの内容を編集し、保存ボタンを押下する。
2) 「git add .」を実行し、作業ディレクトリ内の全ファイルを、コミット対象ファイルとしてインデックスする。
3) 「git commit -m “(commit時のコメント)”」を実行し、作業ディレクトリ内の全ファイルを、ローカルリポジトリにコミットする。
4) Git Guiを開き、masterブランチの履歴を確認した結果は、以下の通り。
元の(master)ブランチの内容をリモートブランチへ反映
元の(master)ブランチの内容をリモートブランチへ反映する手順は、前回と同様にgit pushコマンドを利用する。その手順は以下の通り。
1) 「git push (リモート名) (ブランチ名)」を実行し、ローカルリポジトリの内容をリモートリポジトリに反映する。
2) GitHub上のリモートリポジトリを確認すると、以下のように、ローカルリポジトリの内容がリモートリポジトリに反映されていることが確認できる。
3) 今回作成したfeatureブランチは不要なので、「git branch -d (ブランチ名)」というコマンドで削除する。
要点まとめ
- Gitでブランチをマージする際、マージ元とマージ先で同一ファイルの同一行を更新していた場合に、コンフリクト(衝突)が発生してしまう。
- コンフリクトが発生した場合は、コンフリクトが発生したファイルを修正後、git add⇒git commitの順に対応すればよい。