
Webサービスやアプリ開発の現場では必須のバージョン管理システム「Git(ギット)」。Gitは、専用のソフトを使えばクリックで直感的に操作することもできますが、いざというときにコマンドが使えると便利です。
第3話 では、2つのブランチを統合するマージコミットの作り方と、その仕組みを学びました。
$ git merge [ブランチ名]
今回の第4話は、コンフリクトについてです。なにそれ…と思われる方も、このお話しを通して、わかばちゃんと一緒にコンフリクトについて学んでいきましょう。

【筆者】湊川 あいさん
フリーランスのWebデザイナー・漫画家・イラストレーター。マンガと図解で、技術をわかりやすく伝えることが好き。 著書『わかばちゃんと学ぶ Git使い方入門』『わかばちゃんと学ぶ Googleアナリティクス』『わかばちゃんと学ぶ Webサイト制作の基本』『運用ちゃんと学ぶ システム運用の基本』が発売中のほか、マンガでわかるGit・マンガでわかるDocker・マンガでわかるRuby・マンガでわかるScrapbox・マンガでわかるLINE Clova開発・マンガでわかる衛星データ活用といった分野横断的なコンテンツを展開している。・Amazon著者ページ
・Twitterアカウント
マージ中にコンフリクトが発生したら

コンフリクト解決!の練習
1.まずは、わざとコンフリクトさせてみよう
第3話 と同じように、新しいブランチ「news」を作り、newsブランチとmasterブランチでそれぞれのコミットを作りましょう。自分がnewsブランチで作業していたら、その間に別の人がmasterブランチを更新していたという想定です。
前回と違うのは、わざとコンフリクトさせるために同じ行を編集することです。
▼ newsブランチにチェックアウトした状態で、sample.txtをこのように編集してコミット

▼ masterブランチにチェックアウトした状態で、sample.txtをこのように編集してコミット

では、マージしてみましょう。
マージするためのコマンドは、
マージするためのコマンドは、
$ git merge [統合したいブランチ名]
でしたね。
newsブランチからmasterブランチへ取り込みたいので、masterブランチにチェックアウトしたうえで、
newsブランチからmasterブランチへ取り込みたいので、masterブランチにチェックアウトしたうえで、
$ git merge news
と打ち込みます。
すると、マージは行われず、このような文章が表示されるはずです。
すると、マージは行われず、このような文章が表示されるはずです。


よし!コンフリクト成功だな。

あはは、コンフリクト成功っていうのもおかしな話だね。
英語でも恐れることはありません。翻訳してみましょう。
CONFLICT (content): Merge conflict in sample.txt
→コンフリクト:sample.txtの中でマージの衝突が起きました
Automatic merge failed; fix conflicts and then commit the result.
→自動マージが失敗しました。衝突している箇所を修正して、その結果をコミットしてください
CONFLICT (content): Merge conflict in sample.txt
→コンフリクト:sample.txtの中でマージの衝突が起きました
Automatic merge failed; fix conflicts and then commit the result.
→自動マージが失敗しました。衝突している箇所を修正して、その結果をコミットしてください

何をすればいいかは基本的にGit様がこうやって親切に教えてくれるから、その通りにすればよい。
2.ファイルを開いてコンフリクトを修正する
では、sample.txtを修正するためにファイルを開いてみましょう。


うわっ、なんか変な記号が書き込まれてる!

変な記号とは失礼な!これはGit様が目印として書き込んでくれたのだ。
<<<<<<< HEAD
から
======= まで:
→今自分がチェックアウトしているブランチでの変更
=======
から
>>>>>>> news まで:
→取り込もうとしたブランチでの変更
から
======= まで:
→今自分がチェックアウトしているブランチでの変更
=======
から
>>>>>>> news まで:
→取り込もうとしたブランチでの変更

修正するときはこの記号も合わせて消すようにな。Git初心者だと、この記号がなんなのかわからず、消さずにそのままコミットしてしまいがちだ。

ギクッ……! えっと、今度のハイキングは雨天決行なんですよね。
じゃあnewsブランチの変更内容を残して、と。これでOKですね!
じゃあnewsブランチの変更内容を残して、と。これでOKですね!
▼ 修正後のsample.txt

3.修正したファイルをステージし、コミットしなおす
ステージに乗せて
$ git add sample.txt
コミット
$ git commit -m "sample.txtのコンフリクトを修正"

ふーん、コンフリクトのあとは普通にコミットするだけでいいんだ。これでうまくマージできたね!コンフリクト、怖くなかった!
▼ マージが成功している(SourceTreeで表示したコミットツリー)

コンフリクトの修正が難しい場合

コンフリクトの箇所が多すぎて、修正が難しい場合、マージの途中であっても--abortオプションでマージを中止できます。
$ git merge --abort
あまりにも差分が多すぎる場合は、どちらか一方のブランチのコミット内容が、最新のコミット内容に比べ極端に古いことが多いです。その場合は、最新のコミットから新たにブランチを作って、そこに自分が追加したいコードを加えるといいでしょう。
まとめ
さて、ここまででコンフリクトの解決方法がわかりました。
・コンフリクトした箇所を修正して、コミットしなおす
・コンフリクトした箇所を修正して、コミットしなおす
$ git commit -m
・コンフリクトした箇所が多すぎて修正が難しい場合、マージを中止する
$ git merge --abort
これでコンフリクトが起きても、落ち着いて対処できますね。
Gitにはまだまだたくさんのコマンドがあります。
次回は、git revert(リバート)について学んでいきましょう。
エンジニアの皆さん、日々のスキルアップの時間は十分に取れていますか。 リクルートスタッフィングでは、エンジニアのスキルアップを応援するため、登録者限定で情報配信などを行っています。 リクルートスタッフィングでの就業に関わらず使えるものですので、これを機にお役立てください。
▼登場キャラクター紹介


▼わかばちゃんが登場する書籍
▼ これまでの「マンガでわかるGit」
第1話「リポジトリの作成」
第2話「ブランチの概念」
第3話「マージの仕組み」
第4話「コンフリクトの修正」
第5話「git revert」
第6話「git reset 3種類」
第7話「git reflog」
第8話「git switchとgit restore」
第9話「git diff」
第10話「git cherry-pick」
第11話「git stash」
第12話「git grep」
第13話「git blame」
第14話「git remote」
第15話「.gitconfig でコマンドを短縮」
第16話「.gitconfig と .git/config で複数のGitアカウントを使い分ける」
第17話「prune オプション」
第18話「git tag」
第19話「detached HEAD 状態って何?」
第2話「ブランチの概念」
第3話「マージの仕組み」
第4話「コンフリクトの修正」
第5話「git revert」
第6話「git reset 3種類」
第7話「git reflog」
第8話「git switchとgit restore」
第9話「git diff」
第10話「git cherry-pick」
第11話「git stash」
第12話「git grep」
第13話「git blame」
第14話「git remote」
第15話「.gitconfig でコマンドを短縮」
第16話「.gitconfig と .git/config で複数のGitアカウントを使い分ける」
第17話「prune オプション」
第18話「git tag」
第19話「detached HEAD 状態って何?」