コンフリクトって!?Gitバージョン管理でマージしたときに発生した衝突を解決する

★気に入ったらシェアをお願いします!


coflict

みなさん、こんにちは!
テキストファイルがかなり好きになってきましたタカハシ(@ntakahashi0505)です。

さて、引き続き非エンジニアかつ初心者向けにバージョン管理システムGitとそのクライアントSourceTreeの使い方をお伝えしています。

前回はこちらの記事でした。

SourceTreeでバージョン履歴を分岐したりマージしたりする方法
Gitバージョン管理において履歴を分岐させるブランチと呼ばれる機能、分岐した履歴を統合するマージと呼ばれる機能について、GitクライアントのSourceTreeを使った方法についてお伝えしていきます。

ブランチを切ってバージョンを分岐させる方法、そして分岐させたブランチをマージして統合する方法についてお伝えしました。

こうすることで、複数人での並行作業や、別々のバージョンを試してみる、また最終版を安定確保しておく、などの作業の進め方が実現できますので、非常に便利です。

しかしながら、分岐があることにより困ったことが発生する場合があります。

特に複数人で作業する際には十分に起き得るのですが、

  • 同じ箇所を
  • 別々のブランチで
  • 別々の変更をかけてしまっているのに
  • マージする

この場合、二つの分岐で不整合が起きてしまい、履歴としてその状態から進ませることができなくなります。

これを「衝突」または「コンフリクト」というのですが、今回はSourceTreeでGitバージョン管理をしている際に、この衝突を解決する方法について解説をしていきます。

Gitで衝突を発生させる

わざわざ衝突させるのもおかしい話ですが、ひとまず無理やり衝突させてみます。

今回は以下の図の状態からスタートしますよ。

現在のGitステータス

sample.txtのファイルについてGitバージョン管理をしていて、masterの状態はこちら。

masterでの最新の状態

それぞれのブランチで別の変更を加える

masterからブランチhogeを切って、そちらで一部変更を加えました。test2をtest3に修正しました。

hogeでの最新の状態

次にmasterに戻って、そちらではtest2をtest4に変更をしてコミットをしました。

masterに修正をかけてコミットした状態

masterとhogeのそれぞれで同じ箇所に別の変更を加えてしまった状態です。

別の変更が加わっている状態でマージ

ではこの状態でhogeをmasterに吸収する形でマージしてしまいましょう。

まずmasterにチェックアウトした状態で、上のアイコンから「マージ」を選択します。

それぞれのブランチで別の変更がかけられた状態でマージ

hogeをmasterに吸収しますので、hogeの最新コミットを選択した状態で「OK」。

マージするコミットを選択

衝突発生!

はい、予定通り衝突が発生しました。

マージをした際に衝突が発生した際のメッセージ

本来はあまり喜ばしいことではないのですが、狙ってやるとわりと気持ちがいいですね…。

「続行するには衝突を解決する必要があります。」とのことです。当然、Gitとしてはどちらの変更を選択すべきかの判断はつきませんので、人の力で解決しなくてはいけません。

では、次からこの衝突を解決する方法をお伝えしていきます。

SourceTreeでコンフリクトを解決する

左側のメニューから「作業コピー」を選択してみますと、作業ツリーにはsample.txtに「!」マークがついています。

作業ツリーにはエクスクラメーションマーク

これが衝突していますよ、というお知らせになっています。このファイルについてとある修正を加えることで、衝突を解決することができます。

衝突したファイルに修正を加える

では、このファイルをダブルクリックして開いてみましょう。

衝突したファイルを開いた

書いた覚えのない行がいっぱい増えていますね…。この覚えのない行は、衝突が発生したときにGitが気を利かせて追加してくれている情報です。

「<<<<<<<< HEAD」から「=======」の間の行には、現在チェックアウトしているmaster側での状態が記載されています。

「=======」から「>>>>>>>> hoge」の間の行には、hoge側の状態が記載されています。

衝突を解決するには、このどちらかを残して、他方を削除すればOKです。また、Gitが追加してくれた「<<<<<<<< HEAD」「=======」「>>>>>>>> hoge」も合わせて全部削除します。

では、今回はhoge側の内容と正として保存することにします。

hogeの修正を正とした

衝突を解決したファイルをコミット

保存をするとSourceTreeの作業コピーでは「!」マークが消えて、いつもと同様に更新されたという状態になっています。

マージの際の衝突が解消されたのでコミット

また、コミットメッセージには自動で「Merge branch ‘hoge’ Conflicts: sample.txt」と記入されています。

英語ですがわかりやすいので、このままコミットします。

衝突が解決されマージが完了した

ツリーを確認するとマージが無事に完了していることがわかります。

まとめ

SourceTreeでマージした際に発生した衝突を解決する方法についてお伝えしました。

結論としては、いらないやつと余計なやつを全部消すだけなので、結果的には超簡単ですね。

ただ、一点問題がありまして、この方法で衝突を解決できるのはテキストファイルに限られています。

ExcelやPowerPointなどのOfficeファイルをはじめバイナリファイルでは衝突した箇所をGitが探し当てることができませんので、ファイルの衝突部分を一行一行判断するような細やかな解決は困難です。

衝突が発生した際には結果的にどちらかのブランチの最新版をエイ!と採用をしなければならない場合があることを想定しつつ

  • わかりやすいメッセージをつけて細かくコミットをする
  • 別の分岐で同一ファイルを同時に触らないようにする

などの方針で進めるのがオススメです。

さて、一人でGitを使うという想定でいうと、今回の記事でひと段落となります。

次回、共同作業編の準備としてリモートリポジトリ、代表的なホスティングサービスについて紹介します。

非エンジニアのためのGitバージョン管理~BitbucketとかGitHubって何?
ネットを介してGitによる共同作業をする場合にはリモートリポジトリを使います。今回は、リモートリポジトリとは何か、また代表的なホスティングサービスのGitHubとBitbucketについての紹介です。

あと番外編として、エクセルVBAを使っている場合に、テキストファイルを吸い出してGit管理する方法がありますので、こちらもどうぞ!

vbacでエクセルVBAのソースコードをGitバージョン管理する方法
エクセルVBAのソースコードをコマンドラインでインポート、エクスポートができるvbacというツールの使い方を紹介します。これでエクセルVBAのGitバージョン管理が格段にパワーアップします。

どうぞお楽しみに!

連載目次:非エンジニアの初心者向けSourceTreeによるGitバージョン管理

  1. 非エンジニアのためのバージョン管理Git~メリットと導入前の準備
  2. 非エンジニアでもSourceTreeを使えば超簡単にGitでのバージョン管理ができる
  3. SourceTreeでGit管理しているファイルのバージョンをリセットする方法
  4. SourceTreeでバージョン履歴を分岐したりマージしたりする方法
  5. コンフリクトって!?Gitバージョン管理でマージしたときに発生した衝突を解決する
  6. 非エンジニアのためのGitバージョン管理~BitbucketとかGitHubって何?
  7. 非エンジニアのためのGitバージョン管理~Bitbucketの登録とはじめてのプッシュ
番外編: