別れっぱなしとは限らない、きっといつかつながれるはず『 git merge 』
こちらの記事でブランチを切りましたね。
今回の記事はこれをこの後どうするかの話です。
ちなみに、基本的に
このようにマージ(合流)させることがほとんどなのですが、マージさせない場合もあります。
マージについて
マージしないケースって❓
飲食店の暖簾分けみたいな場合です。
色々頑張って更新してきたけど最善の形じゃなかったな〜というとき、あの時点からやり直せたらって時ありますね。
人生は無理ですが😭、git はできます。
今(のブランチ)を捨て、あの時点という過去のコミットから分岐させて、そのブランチをその後ダメだったな〜ってところを改善しながら伸ばしていけばいいのです。
RPG なんかで完璧を求めて、過去のセーブポイントから何回もやり直して上手く進んだら新しくセーブポイント作って、みたい感じです。
パッケージソフトの場合だと、GA 版とは別にお客さん固有のカスタマイズ版を作成し GA 版とは別管理でバージョンを進めていく場合が想定されます。これはあまりイイことじゃないですけど、ビジネスの都合上たまに発生します😥
マージには2種類ある
🔷 ファストフォワード ( Fast-Forward ) マージとは?
🔶 ノンファストフォワード ( Non Fast-Forward ) マージとは?
コンフリクト( conflict )とは?
日本語では衝突です。
ある箇所が、「こちらのマージ元ブランチではこのような内容ですが、取り込み対象のブランチでは違う内容ですけど、どちらの内容にしますか」、的なことです。後ほど解説します。
慣れないうち、そしてテキストファイルを対象にしていない(Excel とか PowerPoint とか)場合は、結構焦ります💦
なので、まずはファストフォワード ( Fast-Forward ) マージからやってみるのがおススメです。
----------- 実際にやってみる -----------
🔘状況整理
対象ファイル(リポジトリの状況)
「売上.txt」というファイルが一つあります。
ブランチとコミット履歴
first commit 時点のファイル内容
2018年:\100 👈1行目の2018年のところだけ金額が記入されている
2019年:\
2020年:\
ブランチ「2019年」の状況
2018年:\100
2019年:\450 👈2行目の2019年のところに金額を追記
2020年:\
ブランチ「2020年」の状況
2018年:\100
2019年:\
2020年:\900 👈3行目の2020年のところに金額を追記
🔘マージを行う
master ブランチに 2019年ブランチをファストフォワード ( Fast-Forward ) マージしてみます。
2行目の2019年のところに金額を追記したコミットを取り込むので、絶対にコンフリクトは起こりません。
要は、master ブランチにコミットを新しく追加したのと同じですので。
この場合、
となり、マージ元ブランチにチェックアウトしている必要があります。
そのうえで、
『 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(-)
樹形図を見てみると
master ブランチの先頭コミットが、2019年ブランチの先頭コミットのところにやってきました。
今度は、この「2019年をマージした」master ブランチに、 2020年ブランチをノンファストフォワード ( Non Fast-Forward ) マージしてみます。
あえて SourceTree でやります。
今回は、絶対にコンフリクトが発生します。
下の画像のように、「2020年」を右クリックして、『現在のブランチに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)。
コミットメッセージは
Merge branch '2020年'
# Conflicts:
# 売上.txt
自動的にこのように入力されています。変えてもイイですが今回はそのままコミットします。
はい、無事完了です。新しい(マージしたよ)コミットが作成されています。
ちなみに
コマンドで、ノンファストフォワード ( 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 の操作ミスっちゃった時とかの修正方法とかありはしますが、ググればなんてことはないです。
あとは実際に使いながら必要になれば調べながら自走していけます。
最後までお読みいただきありがとうございました 😊