Git入門#11(コンフリクトを解決してみよう)




cocomaru
マージしたタイミングで発生するコンフリクト、つまり同じファイルを複数人が編集した時にマージできない場合があるんだけど、それを解消するやり方を教えるね。
hiromin
うん、なんか凄く難しそう…。
cocomaru
大丈夫だよ!最初はコンフリクトが発生した時って焦るかもしれないけど、解決する手順は単純だから。
hiromin
そうなの?じゃあ、今回も説明お願いしまーす((o´v`o)ノ

コンフリクトを発生させてみよう

こんにちは、cocomaruです。

今回は複数人で作業をしている時に、よく起きがちなファイルのコンフリクト(競合)を解決する方法を教えていきたいと思います。

またコンフリクトが発生する状況とは、どういう時か?

それは同じファイルの同じ行に対して、別々の修正がされた時に起こります。

では早速、コンフリクトが起こる状況を作っていきます。
複数人が開発していることを想定し、「feature1」「feature2」というブランチを作成しましょう。

# feature1ブランチ作成 
$ git branch feature1

# feature2ブランチ作成 
$ git branch feature2

# 現在のブランチ表示 
$ git branch
  feature1
  feature2
* master

次にそれぞれのブランチのindex.htmlの同じ行を編集してみましょう。

feature1のindex.html

feature1ブランチの中身は以下のように編集してください。

# feature1ブランチへ移動 
$ git checkout feature1
Switched to branch 'feature1'

# index.htmlを編集(下記参照) 

# ステージング・エリアに追加 
$ git add index.html

# コミット 
$ git commit -m "「Conflictの練習」行追加"
~/Desktop/WorkDir/index.html
・
・ 中略
・
<p>Git statusの練習</p>
<p>Git diffの練習</p>
<p>Conflictの練習</p> <!-- 行追加 ※これはコメントですので記載しなくて大丈夫です。 -->
</body>
</html>

feature2のindex.html

次にfeature2ブランチは以下のように編集してください。

# feature2ブランチへ移動 
$ git checkout feature2
Switched to branch 'feature2'

# index.htmlを編集(下記参照) 

# ステージング・エリアに追加 
$ git add index.html

# コミット 
$ git commit -m "「コンフリクトの練習」行追加"
~/Desktop/WorkDir/index.html
・
・ 中略
・
<p>Git statusの練習</p>
<p>Git diffの練習</p>
<p>コンフリクトの練習</p> <!-- feature1と同じ行に追加 ※これはコメントですので記載しなくて大丈夫です。 -->
</body>
</html>

masterへマージをしてみる

それでは各ブランチのindex.html対して修正が終わったので、masterブランチへマージしてみましょう。

まずはfeature1ブランチをマージします。

# masterブランチへ移動 
$ git checkout master
Switched to branch 'master'

# feature1ブランチをマージ 
$ git merge feature1
Updating f6bc3d0..c9a9d55
Fast-forward
 index.html | 1 +
 1 file changed, 1 insertion(+)

# ログを表示してマージされていることを確認 
$ git log --oneline
c9a9d55 (HEAD -> master, feature1) 「Conflictの練習」行追加
f6bc3d0 Merge branch 'feature'
3754deb gitをGitと大文字に変更
66ddb3b 新規ファイル作成
e033a11 git diff練習用に1行追加
dec7055 git status練習用に1行追加
577fbc4 index.htmlを追加

ここまでは何も問題なく実行できたかと思います。

次はfeature2ブランチをマージしてみてください。

# feature2ブランチをマージ……コンフリクト発生。・゚(゜´Д`゜)゚・。 
$ git merge feature2
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

# git statusでも確認 
$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add ..." to mark resolution)

    both modified:   index.html

no changes added to commit (use "git add" and/or "git commit -a")

…コンフリクトが発生しましたね?!

コンフリクトを解決しよう

では、いよいよコンフリクトを解決してマージまで進めてみましょう!

index.htmlを開いてみてください。おそらくは以下のような内容になっているかと思います。

~/Desktop/WorkDir/index.html
・
・ 中略
・
<p>Git statusの練習</p>
<p>Git diffの練習</p>
<<<<<<< HEAD
<p>Conflictの練習</p>
=======
<p>コンフリクトの練習</p>
>>>>>>> feature2
</body>
</html>

中身を見てみると、見慣れない表記があると思います。

まず「<<<<<<< HEADから=======」は、HEADの内容(つまりmasterブランチ)の編集内容になります。

=======から>>>>>>> feature2」は、マージしようとしたブランチ(ここではfeature2ブランチ)の編集内容が、それぞれ表示されてます。

ここではHEADのmasterブランチの内容を正として進めたいと思います。

以下のように修正してください。

~/Desktop/WorkDir/index.html
・
・ 中略
・
<p>Git statusの練習</p>
<p>Git diffの練習</p>
<p>Conflictの練習</p>
</body>
</html>

編集したら次は↓のように進めます。

# 修正内容をステージング・エリアへ追加 
$ git add index.html

# コミットしてマージ 
$ git commit

これでコミットログが立ち上がりますが、下記のようにログメッセージを残しておくと良いでしょう。

Merge branch 'feature2'

Conflicts:
        index.html

以上で、コンフリクトの解決の説明は終わりです。

最後に、feature1とfeature2のブランチは不要になったので、削除しましょう。

# feature1ブランチ削除 
$ git branch -d feature1
Deleted branch feature1 (was c9a9d55).

# feature2ブランチ削除 
$ git branch -d feature2
Deleted branch feature2 (was 9c53b8a).

またコンフリクトを絶対に発生させないことは難しいですが、コンフリクトを起こさないように気をつけることはできます。
以下に「心構え」と偉そうなことを書いてますが、この2つを意識するとコンフリクトが起きる可能性は低くなるかと思いますので、よければ意識してみてください^^

コンフリクトを起こさない為の心構え
  • 複数人で同じファイルを変更しない
  • マージする前に編集中の状態のファイルがあればcommitやstashをしておく

hiromin
何か難しいそうだと思ったけど、こうやってみると簡単だった♪
cocomaru
そうでしょ?^^コンフリクトが起きると「何が起こった?!」って焦る時もあるけど、修正した人にしっかりと確認して、きちんと修正したら大丈夫だから。
hiromin
うん、わかった(๑•̀ㅂ•́)و

今回はコンフリクトの解決方法を説明してみました!

ブランチの説明は今回で終わりになります。

最後になりますが、機能の追加開発や修正をしたい時は、masterブランチを直接修正せず、今まで学んだように専用のブランチを作成して、そこで作業をし、最終的にmasterブランチへマージするという流れで開発するようにしましょう!

では、またヾ( ´ー`)ノ

Git入門#12(GitHubアカウント作成してみよう)

2018.08.13








コメントを残す

メールアドレスが公開されることはありません。