べくとりうむ.py Written by TicTak(※現在ブログ工事中のため、見づらい点があり申し訳ないです)

【GitHub】コンフリクトとは何か?エラーコメントの見方と解決方法の基本について紹介

Git Programming Basic

こんにちは、ちくたっく(@tictak_py)です。

今回は、GitHubでチーム開発をしていると一度は経験する「コンフリクト」について紹介します。

こんな方に読んで欲しい記事です

  • コンフリクトが発生する原因やエラーの見方・解消方法の基本を知りたい方
  • GitHubで使われている基本的なコマンドを学んでいきたい方

コンフリクトとは「衝突」の意味で、簡単に言ってしまえばファイル上で「自分の作業」と「他人の作業」が重複してしまった状態のことを指します。

コンフリクトは発生しない方が良いですが、今回は意図的にコンフリクトが発生した状況を作り出した上で、エラーメッセージの見方やコンフリクトの解消方法について理解することを目的としていきます。

【GitHub】コンフリクト発生のメカニズムと解消法

【事前準備】コンフリクトを発生させる

まず最初に、意図的にコンフリクトを発生させてみたいと思います。

コンフリクトは、「同一ファイル」の「同一箇所」を複数人が編集した状態でマージした時に発生します。

発生する状況としては色々考えられますが、例えばファイル「hello.txt」を自分が編集している間に、他の人が「hello.txt」を更新してGitHubにアップロードしていた場合、自分のローカル環境を最新にしようと「pull」コマンドを使うとコンフリクトが発生します。

言葉だけだとわかりにくいので、コマンドや画像を見ながら確認していきます。
まず、現在のワークツリーとGitHubの状態は以下のようになっています。

ワークツリーの状況を確認

GitHubの状況確認

そして、手元にある「hello.txt」に以下赤枠の文章を追記したとしましょう。

新たにメッセージを追加

一方で、GitHub上で他の人が「hello.txt」を以下の内容で編集していたとします。
(GitHub上で直接ファイルを編集することは稀ですが、今回は他人側の操作として直接編集します。)

GitHub上でファイル内容を直接編集する方法

他の人が新たにメッセージを4行目に追加
GitHub上でのファイル編集の完了

これで、同一ファイル「hello.txt」の同一箇所「4行目」が編集された状態になりました。ローカルリポジトリにコミットした状態で「pull」コマンドを実行してみます。

コンフリクトが発生

すると、上記赤枠のように「コンフリクトが発生」と表示されたことがわかります。
「hello.txtをマージしようとしたら、コンフリクトが発生したのでマージに失敗した」と記載されています。

ここから、コンフリクトの内容を確認し、コンフリクトを解消していく方法を見ていきます。

【ポイント①】エラーメッセージを確認する

コンフリクトが発生したファイルを開くと、コンフリクトの状況を確認することが出来ます。手元にある「hello.txt」を開いてみると、以下のような状態になっていることがわかります。

コンフリクトが発生したファイルの状況

ポイントは、自分の作業内容と取り込もうとした作業内容が上下で表示されている点です。

「<<<<<HEAD」から「======」で囲まれている部分(赤枠上部)が、今いるブランチで自分が作業した変更内容です。確かに「コンフリクトはおそろしい」といった内容を記載しましたね。

対して、「======」から「>>>>>>」で囲まれている部分(赤枠下部)が、取り込もうとした他の人が作業した変更内容です。GitHub上で「コンフリクトはこわくない」と追加していましたね。

このように、コンフリクトが発生すると「<<<<HEAD」「=====」「>>>>>>」といった一見よくわからない記号が出てきますが、意味を理解しておけば大して難しくないことがわかります。

【ポイント②】コンフリクトを解消する

以上を踏まえた上で、コンフリクトを解消する方法を確認していきましょう。
これも何も難しいことはなく、「あるべき内容」に修正した上で「コミット」すればOKです。

今回の例では、「hello.txt」に記載すべき内容は以下だったとします。

「hello.txt」に記載するべき内容に修正&保存

ファイルを修正したら、あとは「add」「commit」コマンドをするだけです。
これでコンフリクト解消です。

修正後ファイルを「add」「commit」すれば修正は完了

コンフリクトが発生している状態で「git status」を入力してみるとわかりますが、gitはすべきコマンドを教えてくれています(上記最初の赤枠部分)。

今回は非常にシンプルな例でしたが、「コンフリクトの内容」を確認した上で、「あるべき内容に修正」するだけでコンフリクトは簡単に解消出来ることを知っておいてください。

さいごに

今回は、gitで生じるトラブル「コンフリクト」について紹介してきました。
コンフリクトが生じた場合には、落ち着いて対処すれば問題ありませんが、そもそもコンフリクトを起こさせないような仕組み作りをしておくことも重要です。

「同一ファイル」を複数人で編集したことが根本的な原因なので、そもそもそのようなことが起こらないようにすればいいだけです。社内で簡単なルール作りをしておけば不要なトラブルは減らせるはずなので、参考にしてみてください。

「なんだかGitHubの全体像やイメージがわからなかった」という方は、以下記事内で紹介している図を見て頂ければ理解が進むかと思いますので、良ければ参考にしてください。

では今回はこのへんで。