#1. コンフリクトとは何か?
Gitでのコンフリクトは、異なる変更が同じファイルの同じ部分に加えられたときに発生します。例えば、開発者AがfeatureA
ブランチでファイルsample.txt
を変更し、開発者BがfeatureB
ブランチで同じファイルの同じ行を変更した場合です。このような場合、Gitはどちらの変更を採用すべきか判断できないため、コンフリクトが発生します。
#2. コンフリクトの確認方法
コンフリクトが発生すると、Gitは以下のようなメッセージを表示します:
Auto-merging <filename> CONFLICT (content): Merge conflict in <filename>
その後、git status
を実行することで、コンフリクトが発生したファイルが「Unmerged paths」としてリストされます。これにより、どのファイルにコンフリクトがあるのかを把握できます。
#3. コンフリクトを解決する手順
コンフリクトを解決するためには、次の手順を踏む必要があります。
3.1 コンフリクトが発生したファイルを開く
コンフリクトが発生したファイルをエディタで開くと、以下のようなマーカーが表示されます:
<<<<<<< HEAD あなたの変更内容 ======= 相手の変更内容 >>>>>>> <ブランチ名>
<<<<<<< HEAD
の上にある部分は、あなたのブランチで行った変更です。=======
の下には、マージしようとしているブランチの変更内容が表示されています。>>>>>>> <ブランチ名>
は、コンフリクトが発生した別のブランチの識別子です。
3.2 競合を解決する
ファイル内の変更内容を確認したら、競合部分を手動で修正します。必要に応じて、両方の変更を取り入れることもできますし、一方の変更を採用することもできます。マーカーを削除して、最終的な状態に合わせたコードを残してください。
3.3 修正内容を保存
修正が完了したら、変更内容を保存してエディタを閉じます。
3.4 コンフリクト解決のステータスをGitに伝える
修正が完了した後、Gitに対してコンフリクトが解決されたことを伝える必要があります。次のコマンドを実行します:
git add <filename>
これで、修正したファイルがステージングエリアに追加されます。
3.5 マージの完了
すべてのコンフリクトを解決した後、次のコマンドを実行してマージを完了します:
git commit
もし、git merge
コマンドでマージを行っていた場合、Gitは自動的にコミットメッセージを用意します。必要に応じてメッセージを編集して、マージコミットを作成します。
#4. リベース時のコンフリクト
git rebase
を使用している場合もコンフリクトが発生することがあります。リベース中にコンフリクトが発生した場合、まずコンフリクトを解決し、次のコマンドを使ってリベースを続行します:
git rebase --continue
リベースが完了するまで、この手順を繰り返すことになります。
#5. コンフリクトを避けるために
コンフリクトを完全に避けることは難しいですが、次のようなベストプラクティスを守ることで、発生頻度を減らすことができます:
- 頻繁にプルを行う: チーム全員が同じファイルにアクセスしている場合、頻繁にリモートリポジトリから最新の変更を取り込むことが重要です。
- 小さな変更を行う: 大きな変更を一度に行うと、コンフリクトが発生しやすくなります。小さな変更を頻繁に行うことを心がけましょう。
- コードレビューを徹底する: 他の開発者が自分の変更をレビューすることで、競合が発生する前に問題を早期に発見することができます。
#まとめ
Gitのコンフリクトは、開発チーム内で複数の変更が重なる場合に避けられない問題です。しかし、コンフリクトを適切に解決することで、作業をスムーズに進めることができます。適切な手順を踏んで、冷静に対応しましょう。