派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

【連載】マンガでわかるGit ~コマンド編~ 第4話 コンフリクトは怖くない!解決方法

f:id:itstaffing:20190925144740j:plain

Webサービスやアプリ開発の現場では必須のバージョン管理システム「Git(ギット)」。Gitは、専用のソフトを使えばクリックで直感的に操作することもできますが、いざというときにコマンドが使えると便利です。

第3話 では、2つのブランチを統合するマージコミットの作り方と、その仕組みを学びました。

$ git merge [ブランチ名]
(マージする)

今回の第4話は、コンフリクトについてです。なにそれ…と思われる方も、このお話しを通して、わかばちゃんと一緒にコンフリクトについて学んでいきましょう。

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

・Amazon著者ページ
・Twitterアカウント

マージ中にコンフリクトが発生したら

f:id:itstaffing:20190925144742j:plain

コンフリクト解決!の練習

1.まずは、わざとコンフリクトさせてみよう

第3話 と同じように、新しいブランチ「news」を作り、newsブランチとmasterブランチでそれぞれのコミットを作りましょう。自分がnewsブランチで作業していたら、その間に別の人がmasterブランチを更新していたという想定です。

前回と違うのは、わざとコンフリクトさせるために同じ行を編集することです。
 
▼ newsブランチにチェックアウトした状態で、sample.txtをこのように編集してコミット

f:id:itstaffing:20190925144744j:plain

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

f:id:itstaffing:20190925144747j:plain

では、マージしてみましょう。
マージするためのコマンドは、

$ git merge [統合したいブランチ名]
 
でしたね。

newsブランチからmasterブランチへ取り込みたいので、masterブランチにチェックアウトしたうえで、

$ git merge news
 
と打ち込みます。

すると、マージは行われず、このような文章が表示されるはずです。

f:id:itstaffing:20190925144750j:plain

f:id:itstaffing:20190617145541j:plain
よし!コンフリクト成功だな。
f:id:itstaffing:20190617145538j:plain
あはは、コンフリクト成功っていうのもおかしな話だね。
英語でも恐れることはありません。翻訳してみましょう。

CONFLICT (content): Merge conflict in sample.txt
→コンフリクト:sample.txtの中でマージの衝突が起きました

Automatic merge failed; fix conflicts and then commit the result.
→自動マージが失敗しました。衝突している箇所を修正して、その結果をコミットしてください
f:id:itstaffing:20190617145541j:plain
何をすればいいかは基本的にGit様がこうやって親切に教えてくれるから、その通りにすればよい。
 
2.ファイルを開いてコンフリクトを修正する
 
では、sample.txtを修正するためにファイルを開いてみましょう。

f:id:itstaffing:20190925144752j:plain

f:id:itstaffing:20190617145538j:plain
うわっ、なんか変な記号が書き込まれてる!
 
f:id:itstaffing:20190617145541j:plain
変な記号とは失礼な!これはGit様が目印として書き込んでくれたのだ。
<<<<<<< HEAD
から
======= まで:
→今自分がチェックアウトしているブランチでの変更

=======
から
>>>>>>> news まで:
→取り込もうとしたブランチでの変更
 
f:id:itstaffing:20190617145541j:plain
修正するときはこの記号も合わせて消すようにな。Git初心者だと、この記号がなんなのかわからず、消さずにそのままコミットしてしまいがちだ。
f:id:itstaffing:20190617145538j:plain
ギクッ……! えっと、今度のハイキングは雨天決行なんですよね。
じゃあnewsブランチの変更内容を残して、と。これでOKですね!

▼ 修正後のsample.txt

f:id:itstaffing:20190925144754j:plain

3.修正したファイルをステージし、コミットしなおす
 
ステージに乗せて

$ git add sample.txt

コミット

$ git commit -m "sample.txtのコンフリクトを修正"
 
f:id:itstaffing:20190617145538j:plain
ふーん、コンフリクトのあとは普通にコミットするだけでいいんだ。これでうまくマージできたね!コンフリクト、怖くなかった!

▼ マージが成功している(SourceTreeで表示したコミットツリー)

f:id:itstaffing:20190925144757j:plain

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

f:id:itstaffing:20190925144759j:plain
コンフリクトの箇所が多すぎて、修正が難しい場合、マージの途中であっても--abortオプションでマージを中止できます。
 
$ git merge --abort
 
あまりにも差分が多すぎる場合は、どちらか一方のブランチのコミット内容が、最新のコミット内容に比べ極端に古いことが多いです。その場合は、最新のコミットから新たにブランチを作って、そこに自分が追加したいコードを加えるといいでしょう。

まとめ

さて、ここまででコンフリクトの解決方法がわかりました。

・コンフリクトした箇所を修正して、コミットしなおす

$ git commit -m
(通常のコミットと同じコマンドです)
 
・コンフリクトした箇所が多すぎて修正が難しい場合、マージを中止する

$ git merge --abort
(マージを中止する)

これでコンフリクトが起きても、落ち着いて対処できますね。

Gitにはまだまだたくさんのコマンドがあります。
次回は、git revert(リバート)について学んでいきましょう。

第1話はこちら
第2話はこちら
第3話はこちら