Gitを使ったチーム開発で「コンフリクト」が発生し、どうすればいいか分からず焦った経験はありませんか?
この記事では、Gitのコンフリクトについて、その原因から具体的な解決方法までを解説します。git初心者やエンジニア1年目の助けに少しでもなれればと思います。
コンフリクトとは何か?
コンフリクトとは、複数の開発者が同じファイルの同じ箇所を同時に変更した際に、Gitがどちらの変更を採用すべきか自動で判断できなくなる状態のことです。本来であればファイルの変更の判別は自動でGitがやってくれますが、コンフリクトの状態を解決するためには、「人間の判断」が必要となります。
主なコンフリクトの発生パターンは以下の通りです。
・同じファイルの同じ行を異なるブランチで変更した場合
・片方のブランチでファイルを削除し、もう片方で同じファイルを変更した場合
具体的なコンフリクト発生状況を再現
ここでは、develop-aブランチとdevelop-bブランチをマージしようとした際にコンフリクトが発生する状況を例に説明します。
develop-aブランチに切り替えて最新の状態を取得
Bash
git checkout develop-a
git pull origin develop-a
develop-bブランチをdevelop-aにマージしようとする
Bash
git merge develop-b
ここでコンフリクトが発生した場合、コマンドラインには以下のようなメッセージが表示されます。
Auto-merging [ファイル名]
CONFLICT (content): Merge conflict in [ファイル名]
Automatic merge failed; fix conflicts and then commit the result.
ステップバイステップでコンフリクトを解消する
コンフリクトを解消するために、以下の手順で作業を進めます。
1.どのファイルでコンフリクトが起きているか確認する
まず、どのファイルがコンフリクトしているのかを確認しましょう。git statusコマンドを実行すると、Unmerged pathsとしてコンフリクト中のファイルが表示されます。
Bash
git status
2.該当ファイルを開いて差分を確認する
コンフリクトしているファイルを開くと、Gitが自動的に追加した「マーカー」が表示されます。
Plaintext
<<<<<<< HEAD
// こちらはdevelop-aブランチの変更
function login() {
console.log("Welcome to develop-a branch!");
}
=======
// こちらはdevelop-bブランチの変更
function login() {
console.log("Hello from develop-b branch!");
}
>>>>>>> develop-b
<<<<<<< HEADから=======までの間が、現在作業しているブランチ(ここではdevelop-a)の変更です。
=======から>>>>>>> [ブランチ名]までの間が、マージしようとしているブランチ(ここではdevelop-b)の変更です。
3.意図するコードを選択してコンフリクトを解決する
マーカーを参考に、最終的に残したいコードを手動で編集します。
・develop-a側の変更のみ残す
・develop-b側の変更のみ残す
・両方の変更を統合する
のいずれかを行い、マーカーを削除します。
編集が完了したら、そのファイルを解消済みとしてGitに伝えます。
Bash
git add [該当ファイル名]
4.マージを完了させる
すべてのコンフリクトを解消し、git addが完了したら、マージ作業を終了します。
Bash
git commit
解決後の確認とリモートへの反映
コンフリクト解消後、最終的なコードが意図した通りになっているか確認します。特に、アプリケーションが正しく動作するかどうかの確認は必須です。
問題がなければ、リモートリポジトリにプッシュして変更を共有します。
Bash
git push origin develop-a
よくある失敗と注意点
コンフリクト解消時にありがちな失敗とその注意点を紹介します。
git add .を変更ファイルを確認せずに使う:意図しない変更まで解消済みとしてしまう可能性があるのでgit addはファイル単位の変更を確認して慎重に行いましょう。
コミットを忘れる:git addしただけでコミットを忘れると、merge in progressの状態が続きます。
解消後の動作確認を怠る:コンフリクト解消後にアプリケーションが動かなくなることがあるので必ず動作確認を行いましょう。
まとめとコンフリクトの予防法
コンフリクトはチーム開発において自然に発生するものです。しかし、いくつかの予防策を講じることで、発生頻度を減らすことができます。
こまめなgit pullとgit push:最新の状態を頻繁に取り込み、自分の変更を共有することで、コンフリクトの規模を小さくできます。
ペア開発での役割分担:同じファイルを同時に編集しないように意識するだけでも効果があります。
宣伝
くすりの窓口にてインターン募集中です!
AIを活用したローコード(Dify)でアプリ作成を1日で行います。
学年問いません、ぜひご参加ください
https://internshipguide.jp/interns/internDetail/17895