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コマンドで、コミットをする通常のコミット手順を行うだけです。