gitのコンフリクト解消方法となぜ起こってしまうのか

なぜ記事を書こうと思ったか

サービスの開発中にブランチでのコンフリクトが発生した為、修正方法の備忘録として残す為。

そもそもコンフリクトはどの状況で起こる現象?

簡潔に言うと、同じブランチから派生した複数のブランチで同じファイルを編集した際に、コンフリクトが起きる。

hogeファイルを所持しているmainブランチとmainブランチからチェックアウトしたAブランチ、Bブランチがあるとします。Aブランチでhogeファイルを編集し、mainブランチにmergeした際に、Bブランチでもhogeファイルを編集し、mainブランチにmergeしようとした場合に、コンフリクトが生じます。

対処方法(備忘録の為、簡単に書きます笑)

  • 前提条件(コンフリクトを発生させる条件)

1. hogeファイルを所持するmainブランチの作成

hogeファイルの中身

あいさつの種類
①おはようございます。

2. mainブランチから派生したAブランチの作成

hogeファイルの中身

あいさつの種類
①おはようございます。
②こんにちは。

3. mainブランチから派生したBブランチの作成

hogeファイルの中身

あいさつの種類
①おはようございます。
②こんばんは。

4. Aブランチをmainブランチにmergeし、mainブランチでgit pullを行う。

5. Bブランチをmergeしようとしてもコンフリクトを起こしている。(githubのプルリクエストで確認)

スクリーンショット 2022-06-19 18 06 00
  • コンフリクト対処順序

1. ターミナルでBブランチにてgit merge mainを行い、Aブランチの修正内容をBブランチに更新する。

gitのターミナルでは以下の様に表示される。

Auto-merging hogeファイル
CONFLICT (content): Merge conflict in hogeファイル
Automatic merge failed; fix conflicts and then commit the result.

表示された内容は、「更新したけど、hogeファイルでコンフリクトが発生してるから修正してね。」と言う内容です。

2. Bブランチのhogeファイルの内容を確認すると、コンフリクト発生箇所が以下のように表示される。

hogeファイル

あいさつの種類
①おはようございます。
<<<<<<< HEAD
②こんばんは。
=======
②こんにちは。
>>>>>>> main

HEAD側のコードはBブランチの変更内容、main側のコードは取り込まれたmainブランチの内容を表しています。

3. Bブランチのhogeファイルを正しい内容に変更する。

hogeファイル

あいさつの種類
①おはようございます。
②こんにちは。
③こんばんは。

4. ターミナルにてBブランチでgit add [hogeファイルのパス]git commit -m "コメント"を行い、Bブランチにpushする。

`[hogeファイルのパス]`が分からない場合、git merge mainを行った際の表示された内容にhogeファイルのパスがあります。

5. これでコンフリクトは解消されて、Bブランチをmergeできるようになります。

プルリクエストなどを確認した場合、mergeできる様になっている事が確認できます。

スクリーンショット 2022-06-19 18 59 36

コンフリクトを少なくするために

基盤となるブランチ(ほぼmainブランチ)が他のブランチの変更をmergeした後に、新しいブランチを作成する事を心掛けるだけで極力コンフリクトを無くすことは可能だと思います。しかし、派生したブランチの変更をmergeせずに他のブランチを作成しないといけない状況もある為、その際はコンフリクトを解消しましょう。

最後に

もっと良い対処方法や対策方法、間違っている箇所があれば、ぜひ教えていただけると嬉しいです。

読んで頂きありがとうございました。

参考記事