git merge - マージする

「git merge」コマンドでマージができます。git mergeの引数はコミットIDですが、ブランチはコミットIDに名前を付けたもので、日常の用途においては、ブランチ名を指定してマージを行います。マージ先は、現在のカレントブランチです。

git merge ブランチ名

マージって何?

マージとは、ソースコードに加えられた変更を、取り込むことをいいます。

たとえば私の現在のmainブランチに「a.txt」というファイルがあったとします。

わたしの現在のmainブランチの「a.txt」の内容

foo
bar

マシュマロさんが「main」ブランチから派生させた「masu_fix_bug」というブランチで、作業を行い、コミットをしていったとしましょう。そして「a.txt」は次のようになりました。

マシュマロさんの「masu_fix_bug」ブランチの「a.txt」の内容

foo
bar
baz

私は「main」ブランチにマシュマロさんの「masu_fix_bug」の内容を取り込みたい。

このような場合に、差分を解析して、取り込んでくれるのが、マージという機能です。差分は「git diff」コマンドで確認することができます。

git diff マージしたいブランチ名

マージのアルゴリズム

マージには、適用されるアルゴリズムが複数あります。

ファストフォワードマージ

一番単純なマージのアルゴリズムです。コミットを単純に進めることで、マージが可能な場合は、これが選択されます。

ノンファストフォワードマージ

二つのブランチの共通の祖先の位置からのそれぞれの差分をマージします。マージが衝突する場合があります。

ここで、びっくりするのは、マージするときに、viなどのコマンドラインエディタが立ち上がることです。

何も問題がなければ「ESC」でコマンドモードにして「wq」「Enter」(保存して終了)と押して、マージを完了させましょう。

マージの衝突の解決

マージが衝突した場合は、衝突を解決する必要があります。ぶつかった場合は、ソースコードの中に、以下のように表示されます。私はパスを「/foo」に変え、マシュマロさんはテキストを「Good bye」に変えてしまったので、衝突してしまいました。

コードほにゃ前

<<<<<<< HEAD
<a href="/foo">Hello</a>
=======
<a href="/bar">Good bye</a>
>>>>>>> masu_fix_bug

コードほにゃ後ろ

この部分は、どうあるべきなのかを、考えて、手動で修正する必要があります。修正の例です。

コードほにゃ前

<a href="/foo">Good bye</a>

コードほにゃ後ろ

これで、二人の変更内容が正しく反映された内容ができました。

後はgit addコマンドで「git add .」して、git commitコマンドで、コミットをする通常のコミット手順を行うだけです。

関連情報