Git

【Git】コンフリクトとは?どうやって解消するのか?【初心者向け】

【Git】コンフリクトとは?どうやって解消するのか?【初心者向け】

こんにちは、物書きエンジニアです。

今回は、Git初心者向けにGitにおける『コンフリクト』とはどういう状態かそして、コンフリクトの解消手順についてまとめます。

 

なるべく丁寧に書くので、参考にして頂けると幸いです。

【Git】コンフリクトとはどういう状態か?

Gitにおける「コンフリクト」とは、要は複数人が同じ箇所を変更した場合に、どの記述を優先したらいいか分からない状態のことです。

 

図を交えて解説します。

Gitを使って二人が開発をしているとします。それぞれがブランチを切って(作って)それぞれの開発をしている状態です。

ブランチを切って(作って)それぞれが開発をしている

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

二人が全く同じ箇所のコードを書き換えてマージ

 

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

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

 

これが、Gitにおけるコンフリクトと呼ばれる状態です。

 

ざっくり言うと、複数人が同じ場所を変更したことによるエラー的なものと思って頂ければ大丈夫です。

 

【Git】コンフリクトはどうやって解消するのか?

次に、コンフリクトの解消手順について説明していきます。

基本的な考え方はシンプルです。

コンフリクトが起きた箇所を「目標とする記述」に整える

 

具体的に見ていきましょう。

先ほど見たように、Gitで複数人が同じ箇所を変更すると、「コンフリクト」が発生します。

このときに出てくるのが、以下のような画面です。

コンフリクトが発生している画面

 

この画面が、「コンフリクトが起きている」ことを表しています。(この画面の詳しい説明は後ほどします)

 

では、これをどうすればいいのでしょうか。

 

方針はシンプルで、単に直せばいいのです。

無駄な部分を削ってやって、理想の形に整えます。

 

これだけでコンフリクトは解消できます。

難しく考える必要はありません。

 

以下で、コンフリクトが起きてからコンフリクトを解消するまでをハンズオン形式でやってみます。

実際に手を動かしてみるとイメージが掴みやすくなると思うので、ぜひチャレンジしてみて下さい。

 

【Git】コンフリクト解消ハンズオン【手順の解説】

ここまでで、「コンフリクトとはどういう状態か?」そしてざっくりとした「コンフリクト解消の方法」は理解できたと思います。

最後は、実際に手を動かして挙動を確かめてみましょう。

よりイメージが掴めると思います。

 

以下、コンフリクトを起こす」「コンフリクトを解消するの二つのパートに分けて進めていきます。

コンフリクトを起こしてみる【Git】

まずは、練習用のHTMLファイルを作りましょう。

私はデスクトップに「git」という名のディレクトリ(フォルダ)、その中にindex.htmlファイルを作りました。(別に場所やファイル形式はなんでも構いません)

 

ターミナルでgitディレクトリに移動したら、とりあえずローカルリポジトリを作成しておきましょう。「git init」で初期化(ローカルリポジトリを生成)です。

git init

 

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

作業用のブランチを二つ作成

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

参考:fatal: Not a valid object name: ‘master’. て言われたときどうした?

 

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

作成したブランチの確認

私は事前にGitコマンドに対してエイリアス(別名)を登録しているので、「git br」コマンドを打っていますが、登録していない場合は「git branch」と打つようにしましょう。また、後ほど出てくる「git st」では、「git status」と打つようにして下さい

 

masterブランチからブランチを二つ切って、それぞれが開発をしている状態をイメージします。

 

次に、それぞれのファイルを変更しましょう。

このとき、コンフリクトを起こすために、あえて同じ箇所を編集してみます。

 

まずは、feature/1ブランチです。

git checkoutでmasterブランチからfeature/1ブランチへ移動します。

git checkoutでmasterブランチからfeature/1ブランチへ移動

 

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

feature/1ブランチのindex.htmlファイルの「3行目」を編集

 

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

featureブランチをmasterブランチへマージ

 

これで、feature/1のindex.htmlファイルの3行目で編集した内容を、masterブランチへマージすることができました。

 

次に、feature/2の編集をしていきます。先ほどと同様に、index.htmlの「3行目」を編集していきましょう。

checkoutでブランチを切り替えて、index.htmlを編集です。

checkoutでブランチをfeature/2へ切り替え feature/2ブランチにてファイルの編集(3行目)

 

編集できたら、addしてcommitして、masterブランチにマージしましょう。

すると、以下のようなメッセージが表示されるはずです。

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ブランチの記述を表しています。

masterブランチの記述

 

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

feature/2の記述

 

コンフリクト解消のため、これらの記述を整えていきます。

 

まずは、「最終的にどうしたいか」を考えます。

今回は、二つの文章を上下に並べることとしましょう。6行目にある文章を、5行目に移動させて下さい。

6行目にある文章を、5行目に移動

 

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

いらない部分を削除

こんな感じで綺麗になりました。

 

以上でコンフリクトの解消は完了です。

ターミナルで「git status」を打ってみると、以下のように出てきます。

git status

 

要は、「まだマージが完了してないから、コミットして!」と言っています。

 

addをしてgit statusで確認してみると、

addをしてgit statusで確認

 

こんな表示が出ています。

All conflicts fixed but you are still merging.
(use “git commit” to conclude merge)

要は、「コンフリクトは直せたけど、まだマージの途中だよ。commitしてマージを完了させて!」と言っています。

ということで、最後にcommitをしておきましょう。

 

commitしてgit statusで状況を確認すると、

commitしてgit statusで状況を確認

 

コンクリフトの解消&マージに成功です!お疲れ様でした!!

 

以上がコンフリクト解消の流れとなります。

 

Gitでコンフリクトを防ぐために意識すべきこと

「コンフリクトの解消なんてしたくないよ!」という場合は、どうすればいいのでしょうか。

簡単です。コンフリクトを起こさなければいいのです。

 

では、どのようにすればコンフリクトを起こさずに済むのでしょうか。

重要な原則は以下の二つです。

  • 複数人で同じファイルを編集しない
  • ブランチ(ファイル)を常に最新の状態に保つ

 

複数人で同じファイルを編集しない

当たり前ですが、同じファイルを複数人が同時に編集しなかったら、コンフリクトは起きません。

互いにコミュニケーションを取って、「今作業しているファイルはどれか」を確認しながら作業するようにしましょう。

 

ブランチ(ファイル)を常に最新の状態に保つ

とはいえ、例えば別ブランチで作業していて同じ箇所を修正する場合はあると思います。

そのときに意識すべきなのは、常にブランチ(ファイル)を最新の状態に保つことです。

 

例えば、誰かが自分とは別のブランチで作業していて、その変更をmasterにマージした場合、そのmasterの最新の状態を自分のブランチにすぐに取り込むようにしましょう。

こうすることで、常に自分のブランチを最新に保つことができ、コンフリクトのリスクを減らすことができます。

 

初心者のうちは、まずはこの二つをを意識すると良いでしょう。

 

Gitオススメの教材【Udemy】

最後にオススメのGitの教材を紹介します。

私はこれまで多くのGit関連の教材を見てきましたが、一番オススメできるのは、以下のUdemyのGit講座です。

UdemyのGit講座を見てみる

 

説明がとても分かりやすいので、Gitのイメージを掴むには最適だと思います。

最初にこの動画で軽く勉強して、次に実際に手を動かして慣れていけばGitに困ることはなくなるでしょう。

 

参考にして頂けると嬉しいです。

 

【Git・コンフリクト】まとめ

今回の内容を簡単にまとめます。

Gitコンフリクトまとめ
  • Gitの「コンフリクト」とは:複数人が同じ場所を変更したことによるエラー的なもの
  • コンフリクト解消法:実際にコンフリクトが起こっているファイルを開いて、内容を修正する

 

今回は、Gitにおいてコンフリクトが起こる原因とその解消法について、ハンズオン形式で解説してみました。

少しでも参考になっていたら嬉しいです。

 

Twitterで発信中!

Twitterでプログラミング学習やブログ運営に関するTipsを発信しています。

ぜひフォローをお願いします!

 

こちらの記事もおすすめです

未経験でエンジニアになる前に最低限やっておいた方が良いこと6選
未経験でエンジニアになる前に最低限やっておいた方が良いこと6選未経験でエンジニアになる前に最低限やっておいた方が良いことをまとめました。少しでもこれからエンジニアになる方の参考になれば幸いです。...
新米エンジニアにおすすめの本まとめ【駆け出しエンジニア向け】
新米エンジニアにおすすめの本まとめ【駆け出しエンジニア向け】新米エンジニアにおすすめの本をご紹介します。...
現役Web系エンジニアが考えるエンジニアのメリットデメリット
現役Web系エンジニアが考えるエンジニアのメリットデメリット現役Web系エンジニアとしてエンジニアのメリットデメリットを考えてみました。...

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA