数人で開発していると、たまに起きちゃう「コンフリクト」の解消方法を紹介します。
コンフリクトとは?
Git コンフリクト(Git conflict)は、Git バージョン管理システムにおいて、複数の開発者が同じファイルや行を同時に変更し、それらの変更が競合(conflict)する状況を指します。このような競合が発生すると、Git は自動的にマージを行おうとしますが、自動的に解決できない場合にコンフリクトが発生します。Git コンフリクトは、通常、次のような場面で発生します。
- 複数の開発者が同じファイルを同時に変更する場合。
- プルリクエストを行う際に、ベースブランチとマージ対象ブランチで競合する変更がある場合。
コンフリクトが発生した場合、Git は競合している箇所を示し、開発者に手動で解決する機会を与えます。開発者は競合を解決し、変更をコミットしてマージを完了させる必要があります。
プルリクエストできる
渡辺さんが画像追加し、リモートリポジトリへ送信しました。コンフリクトは発生していないので、そのままプルリクエストができます。
コンフリクト発生
山田さんのブランチは、ベース(メイン)ブランチが最新ではない状態でプッシュしたため、プルリクエストしようとすると、「自動的にマージできません」と表示されてしまいました。
上記の状態で、プルリクエストすることもできますが…下記のようになるので、レビュアーからベースブランチをマージして再度プッシュするように指示されます。
山田さんは、ローカルリポジトリでベースブランチをマージし、再度プッシュしなければいけません。
コンフリクトを解消する
私は、下記のように統合しています。
- git switch <ベースブランチ名>
- git pull
- git switch <統合したいブランチ名>
- git merge <ベースブランチ名>
統合した後、再度ステージング・再コミット・再プッシュしてください。
再プルリクエスト
再度、プルリクエストしようとすると2つのプッシュが確認できますね!
一度、プルリクエストをして再プッシュすれば、レビュアーは2つのコミット内容を確認できるので、再プルリクエストしなくても大丈夫です。レビュアーに再プッシュしたことを連絡してプルしてもらいましょう!
プルリクエストをする前に統合したのであれば、きちんとプルリクエストまで完了してください。
変更箇所が被っている場合
統合しようとした際、ベースブランチとの比較が出てきます。「ベースとの比較」「変更内容を左(右)から受け入れる」など統合後に内容確認をすることができます。
変更を受け入れると、上記のように取り込む内容について問われますので、クリックして保存→ステージング・コミット・プッシュしてプルリクエストをしましょう。
同じ個所を同時に変更することはほぼないと思いますが、今回記事を書くためにいろいろやっていたら上記のように表示されたので、掲載してみました。「両方取り込む」をクリックすると、自分がプッシュする際のデータ+ベースブランチのデータに変更になるので、その後きれいに修正してから、ステージング・コミット・プッシュ→プルリクエストすればよいと思います。