Gitのコンフリクトを解消する手順!並行開発をする際に要チェック

Gitのコンフリクトを解消する手順!並行開発をする際に要チェック

Gitの「コンフリクト」という現象は、Git初心者の方がよくぶつかる壁です。
コンフリクトは、Gitで編集・管理するデータ間に矛盾が生じることで発生し、コンフリクトした場合は、適切に対処する必要があります。この記事では、Gitのコンフリクトの概要や解消する手順、コンフリクトを事前に防ぐ方法について解説します。

コンフリクトとは重複項目のお知らせ

コンフリクトとは、Gitで管理する複数のデータに、重複や競合が発生している状態のことです。コンフリクトが発生すると、Gitから「同一文言の行がある」といった内容を伝えるエラーメッセージが返ってきます。コンフリクトが発生しても、正しい手順で解消すれば、致命的な障害などは起きません。コンフリクトの原因を把握し、適切に対処することが重要です。

\21万以上のオンラインコースから選べる!/

Udemyで講座を探す

並行開発を行うとコンフリクトしやすい

システム開発やWebサイト制作など、同じプロジェクトの作業を複数人で同時に進めると、Gitのコンフリクトが発生しやすくなります。

例えば、何らかのツールを複数人で開発している時に、同じ行に対して異なる編集を行うとコンフリクトが発生します。同一行の編集内容がブランチ(分岐)によって異なる場合、マージ(合流)することができません。不一致の箇所に変更を加え、内容を統一すればコンフリクトを解消できます。

コンフリクトを解消する手順

ここでは、Gitのコンフリクトを解消する具体的な手順を解説します。業務の中でコンフリクトが発生した時に備えて、練習としてコンフリクトの解消方法を学んでおきましょう。

コンフリクトをあえて発生させて仕組みを知ろう

コンフリクトを解消する手順を深く理解するには、「なぜコンフリクトが起きるのか」を知る必要があります。そこで、簡単な同時並行ファイルをGitで作成し、コンフリクトをあえて発生させてみましょう。以下ではWindowsのコマンドプロンプトで「version2.39.0」のGitを用いて解説しますが、OSやバージョンが異なる環境でも基本的な流れは同じです。

まずは、作業用のディレクトリを作成しましょう。ディレクトリ名は任意のもので構いませんが、今回の解説では「test」という名称にします。コマンドプロンプトで「cd test」と入力し、testディレクトリに移動します。そして、Gitのリポジトリを作成するため「git init」コマンドを実行してください。成功すると次のようなメッセージが表示されます。

testフォルダ内に、以下のような内容が入力されたテキストファイル「file.txt」を作成してください。

コマンドプロンプトで「git add file.txt」のコマンドを入力してテキストファイルをステージングエリアに反映し、「git commit -m “任意のメッセージ”」でコミットしましょう。「-m」とは、コミット時にメッセージを付加するオプションです。

ここまでの操作で、メインのブランチである「master」にテキストファイルが作成されました。

次に、あえてコンフリクトを発生させるための新たなブランチを作成します。ブランチを作成するコマンドは「git branch [任意のブランチ名]」です。今回は「NEW」という名前でブランチを作成します。そして、「git checkout [ブランチ名]」コマンドを使って、対象のブランチに移動しましょう。

一見すると何も起きていないように見えますが、上記の操作で「master」ブランチから「NEWブランチへの移動が完了しています。現在のブランチは「git branch」コマンドで確認することが可能です。

コマンドを入力すると、ブランチの一覧が表示され、現在いるブランチに「*」マークが表示されます。上記の画像は「NEW」のブランチにいる状態です。
この状態で、「file.txt」を次のように変更して保存します。

2行目に、”追加した情報は「ABC」です”というテキストを追加しました。
そして、先ほどと同様にコマンドプロンプトで「git add file.txt」と「git commit -m “任意のメッセージ”」を入力し、コミットしましょう。

次に、「git checkout master」コマンドで「master」ブランチに戻ってから、テキストファイルの内容を以下のように変更してください。

2行目に、”追加した情報は「123」です”というテキストを追加しました。再びコマンドプロンプトで「git add file.txt」と「git commit -m “任意のメッセージ”」を入力し、コミットしましょう。

今、「master」ブランチでテキストファイルに加えた変更は、先ほど「NEW」ブランチで加えた変更と一部分が異なります。

「master」ブランチのfile.txtの2行目 追加した情報は「123」です。
「NEW」ブランチのfile.txtの2行目 追加した情報は「ABC」です。

 

同じ行を並行で編集した結果、内容に違いが生じたため、今の状態で「master」ブランチと「NEW」ブランチのマージを試みると、コンフリクトが発生します。コマンドプロンプトで、ブランチを統合するためのコマンド「git merge [統合するブランチ名]」を入力してみましょう。今回は「master」ブランチにいる状態で「NEW」ブランチを統合するため、入力するコマンドは「git merge NEW」です。

コマンドを入力してもマージが成功せず、次のようなメッセージが表示されていれば、コンフリクトが発生しています。

上記のメッセージは、「file.txt」内でコンフリクトが起きてマージが失敗したことを知らせ、修正を促す内容です。

発生したコンフリクトの重複を見つけて修正しよう

コンフリクトが発生しマージに失敗すると、修正すべき箇所が対象ファイルに自動で書き込まれます。「file.txt」を開いてみましょう。

「<<<<<<< HEAD」から「= = = = = = =」までが、現在チェックアウトしているブランチで行われた編集内容です。そして、「= = = = = = =」から「>>>>>>> NEW」までが、マージしようとしたブランチで行われていた編集内容を表します。

最終的に統合したい方だけを残し、不要な部分は削除しましょう。例えば、「master」ブランチの編集内容を残したい場合は「<<<<<<< HEAD」と、「= = = = = = =」から「>>>>>>> NEW」までの内容は不要です。

テキストファイルの内容を修正・保存したあと、「git add file.txt」と「git commit -m “任意のメッセージ”」でコミットすると、コンフリクトが修正されます。

コンフリクトが発生した時に、「NEW」ブランチの方の内容に統合したい場合も、同様の手順で対処できます。実際の業務でコンフリクトが発生した場合は、どちらのブランチの内容に統一するかを確認した上で、修正作業を行いましょう。

Gitのコンフリクトを事前に防ぐ方法

Gitのコンフリクトは修正できるとはいえ、コンフリクト起こさないように、事前に防ぐ方が効率的です。ここからは、コンフリクトができるだけ起こらないようにするための方法を紹介していきます。

並行開発をしないようにする

同じファイルに対して。複数のブランチでの並行作業が起こらないようにすると、コンフリクトを予防できます。作業の順番を決めておく、作業ファイルを開発者ごとに分担するなどの対策を行い、管理することで、コンフリクトに悩まされることが少なくなるでしょう。

ファイルを常に最新の状態にする

ファイルを修正する際に、他の開発者がコミットした作業分を更新し、最新の状態に保っておくことも効果的です。作業に入る前に最新の状態にすることをルール化しておくと、コンフリクトが発生するリスクを軽減できます。

Gitのコンフリクトは、異なるブランチで重複して編集されている箇所をお知らせする機能です。コンフリクトが発生した場合、修正すべき箇所が対象のファイルに自動で追記されます。コンフリクトの仕組みや修正方法を理解した上で、Gitを活用しましょう。