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行目」を編集

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

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ファイルを開いて下さい。

こんな感じになっています。

コンフリクトが起きている画面

具体的に何が書いてあるかを説明します。

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で状況を確認

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

 

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

今回はローカルのみでコンフリクトを起こしてみましたが、実際の開発ではリモートリポジトリ(GitHub, Bitbucketなど)との兼ね合いも出てきます。

その場合はもう少し複雑な手順が必要になるのですが、今回は「初心者向け」ということで、実践よりイメージを重視した解説にしてみました。

「より実践的なコンフリクト解消の手順が知りたい」「開発の中で実際にどうやってコンフリクトを解消しているのか知りたい」という方は、以下の記事に実践的な流れを書いておいたので、読んで頂けると嬉しいです。

※すみません。作成中です。気長にお待ちください。m(_ _)m

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

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

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

 

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

もちろん、色々と気を付けることはあります。

しかし、この記事は「初心者向け」ということなので、一つだけ原則をお伝えします。

 

それは、「複数人で同じファイルを編集しない」ことです。

 

当たり前すぎて拍子抜けされたかもしれませんが、ハッキリ言ってこれが一番簡単かつ有効な対策です。

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

 

初心者のうちは、まずはこれをしっかりと意識しておきましょう。

 

Gitオススメの教材【Udemy】

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

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

UdemyのGit講座を見てみる

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

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

 

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

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

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

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

 

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

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

COMMENT

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

CAPTCHA