みなさん、こんにちは!
テキストファイルがかなり好きになってきましたタカハシ(@ntakahashi0505)です。
さて、引き続き非エンジニアかつ初心者向けにバージョン管理システムGitとそのクライアントSourceTreeの使い方をお伝えしています。
前回はこちらの記事でした。
ブランチを切ってバージョンを分岐させる方法、そして分岐させたブランチをマージして統合する方法についてお伝えしました。
こうすることで、複数人での並行作業や、別々のバージョンを試してみる、また最終版を安定確保しておく、などの作業の進め方が実現できますので、非常に便利です。
しかしながら、分岐があることにより困ったことが発生する場合があります。
特に複数人で作業する際には十分に起き得るのですが、
- 同じ箇所を
- 別々のブランチで
- 別々の変更をかけてしまっているのに
- マージする
この場合、二つの分岐で不整合が起きてしまい、履歴としてその状態から進ませることができなくなります。
これを「衝突」または「コンフリクト」というのですが、今回はSourceTreeでGitバージョン管理をしている際に、この衝突を解決する方法について解説をしていきます。
Gitで衝突を発生させる
わざわざ衝突させるのもおかしい話ですが、ひとまず無理やり衝突させてみます。
今回は以下の図の状態からスタートしますよ。
sample.txtのファイルについてGitバージョン管理をしていて、masterの状態はこちら。
それぞれのブランチで別の変更を加える
masterからブランチhogeを切って、そちらで一部変更を加えました。test2をtest3に修正しました。
次にmasterに戻って、そちらではtest2をtest4に変更をしてコミットをしました。
masterとhogeのそれぞれで同じ箇所に別の変更を加えてしまった状態です。
別の変更が加わっている状態でマージ
ではこの状態でhogeをmasterに吸収する形でマージしてしまいましょう。
まずmasterにチェックアウトした状態で、上のアイコンから「マージ」を選択します。
hogeをmasterに吸収しますので、hogeの最新コミットを選択した状態で「OK」。
衝突発生!
はい、予定通り衝突が発生しました。
本来はあまり喜ばしいことではないのですが、狙ってやるとわりと気持ちがいいですね…。
「続行するには衝突を解決する必要があります。」とのことです。当然、Gitとしてはどちらの変更を選択すべきかの判断はつきませんので、人の力で解決しなくてはいけません。
では、次からこの衝突を解決する方法をお伝えしていきます。
SourceTreeでコンフリクトを解決する
左側のメニューから「作業コピー」を選択してみますと、作業ツリーにはsample.txtに「!」マークがついています。
これが衝突していますよ、というお知らせになっています。このファイルについてとある修正を加えることで、衝突を解決することができます。
衝突したファイルに修正を加える
では、このファイルをダブルクリックして開いてみましょう。
書いた覚えのない行がいっぱい増えていますね…。この覚えのない行は、衝突が発生したときにGitが気を利かせて追加してくれている情報です。
「<<<<<<<< HEAD」から「=======」の間の行には、現在チェックアウトしているmaster側での状態が記載されています。
「=======」から「>>>>>>>> hoge」の間の行には、hoge側の状態が記載されています。
衝突を解決するには、このどちらかを残して、他方を削除すればOKです。また、Gitが追加してくれた「<<<<<<<< HEAD」「=======」「>>>>>>>> hoge」も合わせて全部削除します。
では、今回はhoge側の内容と正として保存することにします。
衝突を解決したファイルをコミット
保存をするとSourceTreeの作業コピーでは「!」マークが消えて、いつもと同様に更新されたという状態になっています。
また、コミットメッセージには自動で「Merge branch ‘hoge’ Conflicts: sample.txt」と記入されています。
英語ですがわかりやすいので、このままコミットします。
ツリーを確認するとマージが無事に完了していることがわかります。
まとめ
SourceTreeでマージした際に発生した衝突を解決する方法についてお伝えしました。
結論としては、いらないやつと余計なやつを全部消すだけなので、結果的には超簡単ですね。
ただ、一点問題がありまして、この方法で衝突を解決できるのはテキストファイルに限られています。
ExcelやPowerPointなどのOfficeファイルをはじめバイナリファイルでは衝突した箇所をGitが探し当てることができませんので、ファイルの衝突部分を一行一行判断するような細やかな解決は困難です。
衝突が発生した際には結果的にどちらかのブランチの最新版をエイ!と採用をしなければならない場合があることを想定しつつ
- わかりやすいメッセージをつけて細かくコミットをする
- 別の分岐で同一ファイルを同時に触らないようにする
などの方針で進めるのがオススメです。
さて、一人でGitを使うという想定でいうと、今回の記事でひと段落となります。
次回、共同作業編の準備としてリモートリポジトリ、代表的なホスティングサービスについて紹介します。
あと番外編として、エクセルVBAを使っている場合に、テキストファイルを吸い出してGit管理する方法がありますので、こちらもどうぞ!
どうぞお楽しみに!