【gitをソフト開発で使いこなそう:第6回】マージって何だろう?どんな場面で使うんだろう?

次回の記事

terapotan.hatenablog.jp

前回の記事

terapotan.hatenablog.jp

連載記事一覧

terapotan.hatenablog.jp

前回は、実際のソフト開発を例にしてブランチを使う理由と使い方を解説しました。今回も実際のソフト開発を例にしてマージを使う理由と使い方を解説していきます。

「マージ」

マージとは?

今回の記事ではマージについて解説していきますが、そもそもマージとは何でしょう。

マージとは、複数のブランチの履歴をまとめる動作のことです。 例えば、今masterブランチとdevelopブランチが存在しているとします。
ブランチが二つある図

ここからdevelopブランチの履歴をmasterブランチにまとめて下の図のような状態にしたいとします。
マージ完了図

この時行われる動作がマージと呼ばれる動作です。
また図にもある通り、マージの際には二つのブランチの履歴をまとめたコミットが新しく作成されることがあります。これをマージコミットと言います。

どのような時にマージを行うのか

一方のブランチの履歴(修正箇所など)をもう一方のブランチに反映させたい時に用います。
ソフト開発を題材にして、マージを行う例を一つ挙げてみます。

上の例を簡潔に示す図
機能追加を行うために用意された、masterブランチがあります。
この状態からソフトウェアの修正を行うために、新しいブランチhotfixブランチを作成しました。

ブランチ作成

hotfixブランチでの修正が完了しましたが、このままでは機能追加を行うために追加されているmasterブランチに修正が反映されていません。
そこで、マージを行ってmasterブランチにhotfixブランチの修正の内容を反映します。

gitでマージを実行するには?

gitでマージを行う方法

gitでブランチAにブランチBをマージしたい場合は

git checkout A

を入力しブランチAに移動した後

git merge B

を実行します。
マージが正常に行われると

Merge made by the 'recursive' strategy.
 new.txt | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 new.txt

のようなメッセージが表示されます。

先ほどのhotfixブランチを使った例であれば

git checkout master
git merge hotfix

とコマンドを入力することで、hotfixブランチの修正内容をmasterブランチに反映させることが出来ます。

fast-forwardマージ

fast-forwardマージを説明する例

上の図のmasterブランチとdevelopブランチをマージすることを考えてみましょう。
下の図のようにしても、マージは出来ますが
マージコミットを使った

次のように、masterブランチを移動させるだけでもマージを行うことが出来ます。
fast-forward

developブランチを消してしまえば、あたかもmasterブランチだけにコミットをし続けてきたように見えます。

このようなマージをfast-forwardマージと呼びます。

fast-forwardのコマンドオプション

先ほどの例のように、fast-forwardマージもそうでないマージも行える場合があります。デフォルトの動作では「どちらのマージも行える場合はfast-forwardマージを優先して行い、 そうでない場合はfast-forwardでないマージを行う」となっています。
これを変更したい場合は

git merge [コマンドオプション] [ブランチ名]

git mergeコマンドの直後にコマンドオプションを置きます。
以下、使用できるコマンドオプションを紹介します。

--ff

git merge --ff [ブランチ名]

どちらのマージも行える場合はfast-forwardマージを優先して行い、 そうでない場合はfast-forwardでないマージを行います。
コマンドオプションを省略した場合、(デフォルトでは)この方針でマージが実行されます。

--no-ff

git merge --no-ff [ブランチ名]

fast-forwardマージが行える場合であっても、fast-forwardでないマージ(マージコミットを作成するマージ。)を行います。

--ff-only

git merge --ff-only [ブランチ名]

fast-forwardマージが行えない時は、マージを行いません。

fast-forwardマージのメリット・デメリット

fast-forwardマージを行うと、「マージを行った」という履歴が消えるため、履歴がシンプルになって見やすくなります。
その反面マージをどの段階で実行したのか分からなくなるため、マージを後から取り消すのは大変難しくなります。

fast-forwardでないマージのメリット・デメリット

マージコミットがマージが行われるたびに作成されるため、後でマージを取り消しやすくなります。ですが、マージの作業にそれほど意味がない場合履歴が複雑になって見にくくなる恐れがあります。

次回予告

今回挙げた例は、マージが全て「成功」する例でした。しかし、実際にはマージが「失敗」する時があります。
次回は、マージが失敗するときに起きる「コンフリクト」について解説します。

この記事について

この記事について、誤字や間違っている所がある場合は私のTwitterか、コメント欄から連絡をお願いします。

参考文献

Pro Git

git,GitHubを使うにあたって必要なコマンドの使い方が詳しく解説されています。この連載を読んで分からないことや詳しく知りたいことがあったときはまずProgitを読んでみるといいでしょう。 git-scm.com

次回の記事

terapotan.hatenablog.jp

前回の記事

terapotan.hatenablog.jp

連載記事一覧

terapotan.hatenablog.jp