こんにちは、物書きエンジニアです。
今回は、Git初心者向けに「Gitにおける『コンフリクト』とはどういう状態か」そして、「コンフリクトの解消手順」についてまとめます。
なるべく丁寧に書くので、参考にして頂けると幸いです。
【Git】コンフリクトとはどういう状態か?
Gitにおける「コンフリクト」とは、要は「複数人が同じ箇所を変更した場合に、どの記述を優先したらいいか分からない状態」のことです。
図を交えて解説します。
Gitを使って二人が開発をしているとします。それぞれがブランチを切って(作って)それぞれの開発をしている状態です。

このとき、二人が全く同じ箇所のコードを書き換えてマージしたらどうなるでしょうか?

Gitとしては、どちらのコードを優先すればいいかが分からなくなります。

これが、Gitにおける「コンフリクト」と呼ばれる状態です。
ざっくり言うと、「複数人が同じ場所を変更したことによるエラー的なもの」と思って頂ければ大丈夫です。
【Git】コンフリクトはどうやって解消するのか?
次に、「コンフリクトの解消手順」について説明していきます。
基本的な考え方はシンプルです。
コンフリクトが起きた箇所を「目標とする記述」に整える
具体的に見ていきましょう。
先ほど見たように、Gitで複数人が同じ箇所を変更すると、「コンフリクト」が発生します。
このときに出てくるのが、以下のような画面です。

この画面が、「コンフリクトが起きている」ことを表しています。(この画面の詳しい説明は後ほどします)
では、これをどうすればいいのでしょうか。
方針はシンプルで、単に直せばいいのです。
無駄な部分を削ってやって、理想の形に整えます。
これだけでコンフリクトは解消できます。
難しく考える必要はありません。
以下で、「コンフリクトが起きてからコンフリクトを解消するまで」をハンズオン形式でやってみます。
実際に手を動かしてみるとイメージが掴みやすくなると思うので、ぜひチャレンジしてみて下さい。
【Git】コンフリクト解消ハンズオン【手順の解説】
ここまでで、「コンフリクトとはどういう状態か?」そしてざっくりとした「コンフリクト解消の方法」は理解できたと思います。
最後は、実際に手を動かして挙動を確かめてみましょう。
よりイメージが掴めると思います。
以下、「コンフリクトを起こす」「コンフリクトを解消する」の二つのパートに分けて進めていきます。
コンフリクトを起こしてみる【Git】
まずは、練習用のHTMLファイルを作りましょう。
私はデスクトップに「git」という名のディレクトリ(フォルダ)、その中にindex.htmlファイルを作りました。(別に場所やファイル形式はなんでも構いません)
ターミナルでgitディレクトリに移動したら、とりあえずローカルリポジトリを作成しておきましょう。「git init」で初期化(ローカルリポジトリを生成)です。

次に、作業用のブランチを二つ作りましょう。

このとき、「fatal: Not a valid object name: ‘master」と表示される場合があります。そんなときは、とりあえずaddしてcommitしてみて下さい。解決します。

今ブランチはこんな感じになっています。

私は事前にGitコマンドに対してエイリアス(別名)を登録しているので、「git br」コマンドを打っていますが、登録していない場合は「git branch」と打つようにしましょう。また、後ほど出てくる「git st」では、「git status」と打つようにして下さい
masterブランチからブランチを二つ切って、それぞれが開発をしている状態をイメージします。
次に、それぞれのファイルを変更しましょう。
このとき、コンフリクトを起こすために、あえて同じ箇所を編集してみます。
まずは、feature/1ブランチです。
git checkoutでmasterブランチからfeature/1ブランチへ移動します。

feature/1ブランチのindex.htmlファイルの「3行目」を以下のように編集しましょう(文言は何でも大丈夫です)。

編集できたら、このブランチを(add, commitをしてから)masterブランチへマージしましょう。

これで、feature/1のindex.htmlファイルの3行目で編集した内容を、masterブランチへマージすることができました。
次に、feature/2の編集をしていきます。先ほどと同様に、index.htmlの「3行目」を編集していきましょう。
checkoutでブランチを切り替えて、index.htmlを編集です。


編集できたら、addしてcommitして、masterブランチにマージしましょう。
すると、以下のようなメッセージが表示されるはずです。

CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
要は、「コンフリクトが起きてますよ!このままじゃマージできないから、ちゃんと修正してコミットしてからもう一度チャレンジしてみてね!」と言っています。
ここまでで、「コンフリクトを起こす」ことには成功(?)しました。次に、このコンフリクトを解消していきましょう。
コンフリクトを解消する【Git】
まずは状況整理です。
現状は、feature/1からmasterへのマージは成功し、masterにはfeature/1の変更は反映されています。
しかし、feature/2ブランチに関しては、masterに対してマージしようとしたものの、コンフリクトが起きてしまったため、マージすることができない状態となっています。(今はmasterブランチにいます)
次に何をすればいいのでしょうか。
先ほどのセクションでも簡単に述べましたが、すべきことはシンプルです。コンフリクトが起こっているファイルを開いて、コンフリクト部分を修正しましょう。
index.htmlファイルを開いて下さい。
こんな感じになっています。(エディタはVSCodeを使用しています)

具体的に何が書いてあるかを説明します。
3行目から5行目までは、「HEAD」の記載があることからも分かる通り、現在いるmasterブランチの記述を表しています。

そして、5〜9行目までは、「feature/2」の記述があることからも分かる通り、feature/2の記述を表しています。

コンフリクト解消のため、これらの記述を整えていきます。
まずは、「最終的にどうしたいか」を考えます。
今回は、二つの文章を上下に並べることとしましょう。6行目にある文章を、5行目に移動させて下さい。

次に、いらない部分を削除しましょう。3、6、10行目は削除してOKです。

こんな感じで綺麗になりました。
以上でコンフリクトの解消は完了です。
ターミナルで「git status」を打ってみると、以下のように出てきます。

要は、「まだマージが完了してないから、コミットして!」と言っています。
addをしてgit statusで確認してみると、

こんな表示が出ています。
All conflicts fixed but you are still merging.
(use “git commit” to conclude merge)
要は、「コンフリクトは直せたけど、まだマージの途中だよ。commitしてマージを完了させて!」と言っています。
ということで、最後にcommitをしておきましょう。
commitしてgit statusで状況を確認すると、

コンクリフトの解消&マージに成功です!お疲れ様でした!!
以上がコンフリクト解消の流れとなります。
Gitでコンフリクトを防ぐために意識すべきこと
「コンフリクトの解消なんてしたくないよ!」という場合は、どうすればいいのでしょうか。
簡単です。コンフリクトを起こさなければいいのです。
では、どのようにすればコンフリクトを起こさずに済むのでしょうか。
重要な原則は以下の二つです。
- 複数人で同じファイルを編集しない
- ブランチ(ファイル)を常に最新の状態に保つ
複数人で同じファイルを編集しない
当たり前ですが、同じファイルを複数人が同時に編集しなかったら、コンフリクトは起きません。
互いにコミュニケーションを取って、「今作業しているファイルはどれか」を確認しながら作業するようにしましょう。
ブランチ(ファイル)を常に最新の状態に保つ
とはいえ、例えば別ブランチで作業していて同じ箇所を修正する場合はあると思います。
そのときに意識すべきなのは、「常にブランチ(ファイル)を最新の状態に保つ」ことです。
例えば、誰かが自分とは別のブランチで作業していて、その変更をmasterにマージした場合、そのmasterの最新の状態を自分のブランチにすぐに取り込むようにしましょう。
こうすることで、常に自分のブランチを最新に保つことができ、コンフリクトのリスクを減らすことができます。
初心者のうちは、まずはこの二つをを意識すると良いでしょう。
Gitオススメの教材【Udemy】
最後にオススメのGitの教材を紹介します。
私はこれまで多くのGit関連の教材を見てきましたが、一番オススメできるのは、以下のUdemyのGit講座です。
説明がとても分かりやすいので、Gitのイメージを掴むには最適だと思います。
最初にこの動画で軽く勉強して、次に実際に手を動かして慣れていけばGitに困ることはなくなるでしょう。
参考にして頂けると嬉しいです。
【Git・コンフリクト】まとめ
今回の内容を簡単にまとめます。
- Gitの「コンフリクト」とは:複数人が同じ場所を変更したことによるエラー的なもの
- コンフリクト解消法:実際にコンフリクトが起こっているファイルを開いて、内容を修正する
今回は、Gitにおいてコンフリクトが起こる原因とその解消法について、ハンズオン形式で解説してみました。
少しでも参考になっていたら嬉しいです。
Twitterで発信中!
Twitterでプログラミング学習やブログ運営に関するTipsを発信しています。
ぜひフォローをお願いします!
こちらの記事もおすすめです


