Gitのマージの使い方とコンフリクトの解決方法
Gitのマージの使い方とコンフリクトの解決方法についてまとめました。
マージの使い方
git merge 取り込みたいブランチ名
git merge 取り込みたいリモート名/ブランチ名
ex. git merge origin/master
これらのコマンドで作業中のブランチに、他の人の作業を取り込む、マージ(統合)することができます。 たとえば、現在masterブランチで作業中で、reviewブランチを取り込みたい場合
git merge review
とすることで、masterブランチの内容と異なる部分のreviewブランチのコードをmasterブランチに取り込むことができます。 マージには3種類あります。
- Fast Forward
- Auto Marge
- rebase
rebaseについては次の記事を参照ください。
Fast Forward(早送りになるマージ)
バグが発生してすぐに切り替えたいという場合によく使います。 たとえば、新しいブランチ(reviewfixブランチ)を作ってバグを修正します。その修正内容をmasterに取り込みたいとします。 そのときmasterブランチにいる状態で、
git merge review fix
と入力します。 そうすると、reviewfixブランチが指し示しているコミットファイルのハッシュ値と同じものをmasterブランチが指し示すようになります。 これは、ブランチが枝分かれせず、最新のコミットファイルを指し示すだけということです。このマージをFast Forwardと呼びます。
Auto Marge(基本となるマージ)
コミットファイルがあり、枝分かれしてコミットファイル1をmasterブランチが指し示し、コミットファイルaをfeatureブランチが指し示しているとします。 masterブランチにfeatureブランチの内容を取り込みたいとします。 そのときmasterブランチにいる状態で、
git merge feature
と入力します。 そうするとコミットファイル1は内容が変わるため、masterブランチにfeatureブランチの内容を取り込んだ新しくコミットファイル2が作成され、masterブランチはコミットファイル2を指し示すようになります。 枝分かれして開発している場合、マージコミットという新しいコミットファイルが作成されるということです。 このコミットファイル2のようなマージして生成されるコミットファイルのことをマージコミットといいます。 通常のコミットファイルとの違いは、通常のコミットファイルは一つの親のハッシュ値を保持しているのに対し、マージコミットはマージした親の両方のハッシュ値を保持します。 マージした後、マージできているかを確認する場合、 lsコマンドで概要のファイル名を確認し、
cat 確認したいファイル名
とすることで変更内容を確認できます。 そして、
git log --oneline
コマンドでコミットメッセージから変更の履歴を確認することができます。
コンフリクトとは
複数の人が同じファイルの同じ行に対して編集したときに、どの内容を取り込めばいいのかわからないといった状況のことです。
コンフリクトの解決方法
コンフリクトすると
CONFLICT~~~
Automatic merge failed
といったメッセージが確認できます。 そして、git statusコマンドでどのファイルがコンフリクトしているか確認できます。 そして、そのファイルをみるとコンフリクトしている部分に「<<」 「==」 「>>」の記述が追加されています。
<h2>タイトル</h2>
<<<<< HEAD
<p>サンプル1</p>
=====
<p>サンプル2</p>
>>>>> review
のような記述がアウトプットされます。
サンプル1という現在作業中のHEADにもともとかかれていた内容
サンプル2というのがreviewブランチにかかれていた内容です。
解決するためには、
- ファイルの内容を書き換える
- 「<<」 「==」 「>>」の記述を削除する
の2ステップになります。
ファイルの内容は、サンプル2が正しく、サンプル1は不要だった場合、次のように書き換えます。
<h2>タイトル</h2>
<p>サンプル2</p>
このとき、「<<」 「==」 「>>」の記述を削除します。
そしてgit add→git commitをします。メッセージにはコンフリクトの解決などとメッセージを追加するといいでしょう。
最終的に正しい内容は何かを考えて、ファイルの内容を変更するだけなので、落ち着いて対応しましょう。
コンフリクトをそもそも起こさないようにするためにすべきこと
- 複数人で同じファイルを変更できるようにしないこと
- pullやmergeする前にcommit,stashをしておく
- 変更中のファイルをなくすこと
stashは変更中のファイルを一時保管するコマンドです。
変更中のファイルをそのままにしておくとpullやmergeを行ってもエラーになることがあります。
pullは、必ずpullするブランチに移動してから行います。
pullすると現在のブランチにmergeされてしまうためです。