見出し画像

別れっぱなしとは限らない、きっといつかつながれるはず『 git merge 』

こちらの記事でブランチを切りましたね。

今回の記事はこれをこの後どうするかの話です。
ちなみに、基本的に

このようにマージ(合流)させることがほとんどなのですが、マージさせない場合もあります。

マージについて

マージしないケースって❓

飲食店の暖簾分けみたいな場合です。
色々頑張って更新してきたけど最善の形じゃなかったな〜というとき、あの時点からやり直せたらって時ありますね。

人生は無理ですが😭、git はできます
今(のブランチ)を捨て、あの時点という過去のコミットから分岐させて、そのブランチをその後ダメだったな〜ってところを改善しながら伸ばしていけばいいのです。

RPG なんかで完璧を求めて、過去のセーブポイントから何回もやり直して上手く進んだら新しくセーブポイント作って、みたい感じです。

パッケージソフトの場合だと、GA 版とは別にお客さん固有のカスタマイズ版を作成し GA 版とは別管理でバージョンを進めていく場合が想定されます。これはあまりイイことじゃないですけど、ビジネスの都合上たまに発生します😥

マージには2種類ある

🔷 ファストフォワード ( Fast-Forward ) マージ
🔶 ノンファストフォワード( Non Fast-Forward )マージ

🔷 ファストフォワード ( Fast-Forward ) マージとは?

✔ マージされるブランチの HEAD を、マージするブランチの先端にそのまま移動させるマージ
✔ コンフリクトが一切発生しない

🔶 ノンファストフォワード ( Non Fast-Forward ) マージとは?

✔ 「マージした履歴を残す」マージ
✔ コンフリクトが発生する可能性がある

コンフリクト( conflict )とは?

日本語では衝突です。
ある箇所が、「こちらのマージ元ブランチではこのような内容ですが、取り込み対象のブランチでは違う内容ですけど、どちらの内容にしますか」、的なことです。後ほど解説します。

慣れないうち、そしてテキストファイルを対象にしていない(Excel とか PowerPoint とか)場合は、結構焦ります💦
なので、まずはファストフォワード ( Fast-Forward ) マージからやってみるのがおススメです。

----------- 実際にやってみる -----------

🔘状況整理

対象ファイル(リポジトリの状況)

「売上.txt」というファイルが一つあります。

対象ファイル

ブランチとコミット履歴

✔ master ブランチの first commit から2つブランチを切った
✔ 支流のブランチ (2019年、2020年) にそれぞれ一つコミット

画像2

first commit 時点のファイル内容

2018年:\100 👈1行目の2018年のところだけ金額が記入されている
2019年:\ 
2020年:\

ブランチ「2019年」の状況

画像3
2018年:\100 
2019年:\450 👈2行目の2019年のところに金額を追記
2020年:\

ブランチ「2020年」の状況

画像4
2018年:\100
2019年:\
2020年:\900 👈3行目の2020年のところに金額を追記

🔘マージを行う

master ブランチに 2019年ブランチをファストフォワード ( Fast-Forward ) マージしてみます。
2行目の2019年のところに金額を追記したコミットを取り込むので、絶対にコンフリクトは起こりません
要は、master ブランチにコミットを新しく追加したのと同じですので。

この場合、

マージ元ブランチ = master
取り込み対象のブランチ = 2019年

となり、マージ元ブランチにチェックアウトしている必要があります。
そのうえで、
『 git merge 取り込み対象のブランチ』とコマンドを打ちます。これでファストフォワード ( Fast-Forward ) マージになります。

mevius@SurfaceLaptop MINGW64 ~/Documents/SourceTree/notedemo (master) 👈マージ元ブランチにいることを確認
$ git merge 2019年 👈取り込み対象のブランチを指定
Updating 356eb19..845c06b
Fast-forward 👈ファストフォワードだよと言われた
 売上.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

樹形図を見てみると

画像6

master ブランチの先頭コミットが、2019年ブランチの先頭コミットのところにやってきました。

今度は、この「2019年をマージした」master ブランチに、 2020年ブランチをノンファストフォワード ( Non Fast-Forward ) マージしてみます。
あえて SourceTree でやります。

今回は、絶対にコンフリクトが発生します

下の画像のように、「2020年」を右クリックして、『現在のブランチに2020年をマージ』をクリックします。

画像7

すると、マージをしても良いですかと聞かれるので

edited_マージの確認_2020

『ファストフォワード可能でも新たなコミットを作成する』に☑を入れて、OKをクリックします。
☑を入れなければ、先ほど同様ファストフォワード ( Fast-Forward ) マージになります。

すると・・・

マージで競合

そう、コンフリクト発生です⚠

マージの対象ファイルを開いてみると、中身が下記のようになっていました。

2018年:\100 
<<<<<<< HEAD 👈マージ元ブランチの場合
2019年:\450 
2020年:\ 
======= 
2019年:\ 
2020年:\900 
>>>>>>> 2020年 👈取り込み対象のブランチの場合

そうなんです。master と 2019年 の二行目(2019年の金額)と三行目(2020年の金額)が違うのでどっちが正しいの?と聞かれているのです。

解決のためにこのままファイルを編集します。

2018年:\100 
2019年:\450  👈マージ元ブランチの行残し
2020年:\900  👈取り込み対象のブランチの行残し

このように、不要な(採用しない)行を削除し保存しました。
そしてステージに上げます(add)。

画像11

コミットメッセージは

Merge branch '2020年'

# Conflicts:
#	売上.txt

自動的にこのように入力されています。変えてもイイですが今回はそのままコミットします。

画像9

はい、無事完了です。新しい(マージしたよ)コミットが作成されています。

ちなみに

コマンドで、ノンファストフォワード ( Non Fast-Forward ) マージする場合には、以下のようにします。『 --no-ff 』オプションを付けます。

mevius@SurfaceLaptop MINGW64 ~/Documents/SourceTree/notedemo (master)
$ git merge --no-ff 2020年
Auto-merging 売上.txt
CONFLICT (content): Merge conflict in 売上.txt 👈コンフリクト起きたよ
Automatic merge failed; fix conflicts and then commit the result.

mevius@SurfaceLaptop MINGW64 ~/Documents/SourceTree/notedemo (master|MERGING) 👈表示がmasterではなくなった
$ git status
On branch master
You have unmerged paths.
 (fix conflicts and run "git commit")
 (use "git merge --abort" to abort the merge)
Unmerged paths:
 (use "git add <file>..." to mark resolution)
       both modified:   売上.txt
no changes added to commit (use "git add" and/or "git commit -a")

💡💡💡💡💡💡 ファイルを修正し保存 💡💡💡💡💡💡

mevius@SurfaceLaptop MINGW64 ~/Documents/SourceTree/notedemo (master|MERGING)
$ git add .

mevius@SurfaceLaptop MINGW64 ~/Documents/SourceTree/notedemo (master|MERGING)
$ git status
On branch master
All conflicts fixed but you are still merging. 👈コンフリクトは解決された
 (use "git commit" to conclude merge)
Changes to be committed:
       modified:   売上.txt

mevius@SurfaceLaptop MINGW64 ~/Documents/SourceTree/notedemo (master|MERGING)
$ git commit
[master beb0bc7] Merge branch '2020年'

今回はここまで 🔚

いかがだったでしょうか?

マージまでできれば、まだまだ細かいことはありますがローカルリポジトリでの運用は一通り完結です。

もろもろの git の操作ミスっちゃった時とかの修正方法とかありはしますが、ググればなんてことはないです。
あとは実際に使いながら必要になれば調べながら自走していけます。

最後までお読みいただきありがとうございました 😊

▶ 続けて読むのにおススメな記事


いいなと思ったら応援しよう!

MEVIUS(メビウス) @日系IT企業 | マーケターときどきなんちゃってエンジニア
もしこの記事が何かの参考になったもしくは面白かったという方は、応援していただけると大変嬉しいです😊 これからもよろしくお願いします。