Git

Gitでマージ時のコンフリクトを解決してみた

Gitでブランチをマージする際、マージ元とマージ先で同一ファイルの同一行を更新していた場合に、コンフリクト(衝突)が発生してしまう。今回は、コンフリクトが発生した場合に解決する手順をまとめてみたので、共有する。

前提条件

下記記事の手順を、リモートリポジトリ名=git-merge-resolve-conflictとして実行済であること。

Gitでプロジェクトを作成しGitHubにpushしてみたGitとは、プログラムのソースコードなどをバージョン管理するためのツールで、多くの開発現場で利用されている。また、Gitで管理し...

また、下記記事の手順の「更新後ファイルをfeatureブランチにコミット」までの手順を、リモートリポジトリ名=git-merge-resolve-conflictとして実行済であること。

Gitでブランチを利用して並行開発してみたGitでは、ブランチを利用することで、並行開発を行うことができる。今回は、ブランチを新規作成し、新規作成したブランチ上でファイルの追加・...



やってみたこと

  1. リモートリポジトリの内容を更新
  2. マージによるコンフリクトの発生
  3. コンフリクトの解消
  4. 元の(master)ブランチの内容をリモートブランチへ反映

リモートブランチの内容を更新

featureブランチをmasterブランチにマージした際にコンフリクトを発生させるため、リモートリポジトリのDemoControllerクラスの内容を更新する。その手順は以下の通り。

1) リモートリポジトリのDemoControllerクラスを表示し、編集(Edit this file)ボタンを押下する。
リモートリポジトリの更新_1

2) 以下の赤枠部分のソースコードを編集し、コミットメッセージを記載し、「Commit changes」ボタンを押下する。
リモートリポジトリの更新_2_1

リモートリポジトリの更新_2_2

3) 更新が完了すると、以下の画面が表示される。
リモートリポジトリの更新_3



マージによるコンフリクトの発生

リモートリポジトリの内容を取得し、featureブランチの内容をmasterブランチにマージすると、コンフリクトが発生する。その手順は以下の通り。

1) 「git checkout (変更後ブランチ名)」というコマンドで、masterブランチに変更する。変更前後のブランチは「git branch」コマンドで確認する。
マージによるコンフリクトの発生_1

2) リモートリポジトリが更新されているので、「git pull (リモート名) (ブランチ名)」を実行し、リモートリポジトリの更新内容をローカルに反映する。
マージによるコンフリクトの発生_2

3) 「git merge (マージ元ブランチ名)」というコマンドで、featureブランチの更新内容を、元の(master)ブランチに反映させようとすると、DemoControllerクラスでコンフリクトが発生したことが確認できる。
マージによるコンフリクトの発生_3

4) コンフリクトが発生したDemoControllerクラスの内容は以下の通りで、赤枠の部分でコンフリクトが発生することが確認できる。
マージによるコンフリクトの発生_4



コンフリクトの解消

コンフリクトの解消手順は以下の通りで、コンフリクトが発生したファイルを編集後、git add⇒git commitの順に対応すればよい。

1) コンフリクトが発生したDemoControllerクラスの内容を編集し、保存ボタンを押下する。
コンフリクトの解消_1

2) 「git add .」を実行し、作業ディレクトリ内の全ファイルを、コミット対象ファイルとしてインデックスする。
コンフリクトの解消_2

3) 「git commit -m “(commit時のコメント)”」を実行し、作業ディレクトリ内の全ファイルを、ローカルリポジトリにコミットする。
コンフリクトの解消_3

4) Git Guiを開き、masterブランチの履歴を確認した結果は、以下の通り。
コンフリクトの解消_4



元の(master)ブランチの内容をリモートブランチへ反映

元の(master)ブランチの内容をリモートブランチへ反映する手順は、前回と同様にgit pushコマンドを利用する。その手順は以下の通り。

1) 「git push (リモート名) (ブランチ名)」を実行し、ローカルリポジトリの内容をリモートリポジトリに反映する。
リモートリポジトリへの反映_1

2) GitHub上のリモートリポジトリを確認すると、以下のように、ローカルリポジトリの内容がリモートリポジトリに反映されていることが確認できる。
リモートリポジトリへの反映_2_1

リモートリポジトリへの反映_2_2

3) 今回作成したfeatureブランチは不要なので、「git branch -d (ブランチ名)」というコマンドで削除する。
リモートリポジトリへの反映_3

要点まとめ

  • Gitでブランチをマージする際、マージ元とマージ先で同一ファイルの同一行を更新していた場合に、コンフリクト(衝突)が発生してしまう。
  • コンフリクトが発生した場合は、コンフリクトが発生したファイルを修正後、git add⇒git commitの順に対応すればよい。