1. ホーム
  2. 記事一覧
  3. git mergeの使い方徹底解説!初心者が知るべき基本・オプション・トラブル対応

2025.07.28

git mergeの使い方徹底解説!初心者が知るべき基本・オプション・トラブル対応

はじめに

Gitで複数のブランチを使って開発していると、最終的にはそれぞれの作業内容を1つにまとめる必要が出てきます。このブランチ同士の統合に使われる代表的なコマンドが git merge です。

git merge は、複数のブランチの履歴を統合するための基本的なコマンドで、チーム開発でも頻繁に使われます。一方で、マージの種類(Fast-forward・no-fast-forwardマージ)やコンフリクト対応など、知っておきたいポイントも多くあります。

この記事では、git merge の基本的な使い方から、よくあるトラブルの回避方法まで、初心者でも無理なく理解できるように段階的に解説していきます。実際の手を動かすハンズオンも交えながら、Gitの履歴操作に自信が持てるようになることを目指します。

git mergeとは

git merge は、現在のブランチに対して、別のブランチの履歴を取り込み、統合するためのコマンドです。履歴はそのまま残り、マージ時には「マージコミット」と呼ばれる新たなコミットが自動で作成されます。

たとえば以下のようなブランチのコミット履歴があったとします。

main ブランチに feature ブランチをマージすると、次のように履歴が統合されます。

ここでは F がマージコミットです。過去の変更履歴をそのまま残しながら、異なるブランチを統合できるのが git merge の特徴です。

なぜマージが必要なのか?

チーム開発や個人開発でも、複数のブランチで並行作業をするのが一般的です。機能ごとに分岐したブランチをまとめることで、プロジェクト全体に変更を取り込むことができます。マージによって、ブランチ間の変更を失わずに集約することができます。

マージコミットとは?

git merge を実行すると、異なる履歴同士の分岐点を結びつける特別なコミット(=マージコミット)が自動で生成されます。このマージコミットは、「どのブランチと統合したか」「そのときの履歴の状態はどうだったか」といった統合の履歴を明示的に残すという役割があります。

git mergeとgit rebaseの違い

git mergegit rebase は、Gitでブランチを統合する際によく比較される2つのコマンドです。どちらも同じ目的を果たしますが、履歴の扱い方に違いがあります。

  • git merge

    ブランチの履歴をそのまま残しながら統合し、マージコミットを作成します。並行作業の流れを保ちたいときに便利です。

  • git rebase

    履歴を付け直して直線的に並び替えることで、スッキリした履歴を作れます。履歴を整理したい場面に向いています。

以下のように使い分けられることが一般的です。

利用目的適したコマンド
履歴の流れを明示したいgit merge
履歴をきれいに整理したいgit rebase

2つのコマンドの比較イメージ

git mergeの使い方

git merge の基本的な使い方は、取り込みたいブランチを以下のように指定します。

git merge <統合したいブランチ名>

このコマンドは「現在のブランチ」に対して「指定したブランチ」の内容を取り込みます。たとえば、最新の main ブランチに、作業中の feature ブランチの変更を取り込むとします。

まず main ブランチに切り替えします。

# mainブランチに切り替え
git switch main

そして、以下のコマンドを実行し、feature ブランチの変更を main ブランチへ取り込みます。

# featureブランチの変更をmainブランチに取り込み
git merge feature

成功すると、マージコミットが生成され、履歴が1本に統合されます。

補足:git switchとは

ブランチを切り替える専用コマンドで、Git 2.23(2019年)から導入されました。初心者にも分かりやすく、安全に使える構文として注目されています。以下の記事で詳しく解説していますので、あわせてご覧ください。

git switch完全ガイド初心者でも安全にブランチを切り替える使い方とハンズオン

https://envader.plus/article/545

git mergeでのブランチ指定方法

Gitでマージを行うとき、「どちらのブランチがマージ元で、どちらがマージ先なのか分かりづらい」と感じる方は多いです。

git merge のブランチ指定では、「現在いるブランチ」がマージ先になります。

# 例:mainブランチにfeatureブランチをマージする場合
git switch main      # ← マージ先ブランチに切り替え
git merge feature    # ← マージ元ブランチを指定

「git mergeの使い方」セクションでのコード例は以下のような動作となります。

このように、マージ先にしたいブランチへ 先に切り替えてからmerge コマンドでマージ元ブランチを指定するのが正しい手順です。

git mergeのオプション紹介

git merge には、作業をより便利にするためのさまざまなオプションが用意されています。 特に使う機会の多い代表的なオプションを、以下にまとめました。

オプション説明
--no-ffマージコミットを必ず作る(履歴を明確に)
--ffFast-forwardマージが可能な場合にのみ実行(デフォルトの動作)
--ff-onlyFast-forwardマージが可能な場合にのみマージを実行し、できない場合は中止
--squashブランチ全体を1つのコミットとしてまとめる
--no-commitマージコミットを作らずに一旦止める

これらのオプションを知っておくことで、git merge をより柔軟かつ効率的に使いこなすことができます。次のセクションでは、実際に merge の操作を体験できるハンズオンを紹介します。

git mergeの使い方ハンズオン

ここでは、実際に手を動かしながら git merge の動きを体験してみましょう。

1. テスト用のリポジトリを作成

まずはテスト用のローカルリポジトリを作成します。

# 新しいディレクトリを作成
mkdir git-merge-test
cd git-merge-test

# Gitリポジトリを初期化
git init

次に、main ブランチでファイルを作成してコミットしておきます。

# hello.txt を作成し、初期メッセージを追加してコミット
echo "Hello World" > hello.txt
git add .
git commit -m "初期コミット"

2. feature/1ブランチを作成

feature/1 ブランチを新しく作り、ファイルに追記してコミットします。

# feature/1 ブランチを作成して移動
git switch -c feature/1

# hello.txt に追記してコミット
echo "feature/1 work" >> hello.txt
git add hello.txt
git commit -m "feature/1の追加"

3. git mergeを実行

main ブランチに切り替えなおします。

# mainブランチに切り替え
git switch main

main ブランチ上で以下のコマンドを実行し、 feature/1 ブランチの変更を取り込みます。

# feature/1ブランチの変更をmainブランチに取り込み
git merge feature/1

# マージ実行結果
Updating 1d506a4..c2ac898
Fast-forward
 hello.txt | 1 +
 1 file changed, 1 insertion(+)

この操作によって、feature/1 ブランチの変更は main ブランチに新しく作成されたマージコミットに取り込まれます。


このあとのセクションでは、Fast-forward・no-fast-forward・Three-wayマージの違いや、merge 中にコンフリクトが起きた場合の対処法について詳しく解説していきます。

Fast-forward・no-fast-forward・Three-wayマージの違い

git merge でブランチを統合する際、Gitは自動的に「Fast-forwardマージ」または「Three-wayマージ(no-fast-forward)」のどちらかを選択します。この違いを理解すると、さらにプロジェクトの履歴を見やすく管理できるようになります。

1. Fast-forward(早送りマージ)

Fast-forwardマージは、履歴が1本の直線状になっている場合に起こるマージ方法です。

例えば、main ブランチから新しい feature ブランチを作成して作業した場合を考えてみましょう。

このとき、main ブランチには feature ブランチ作成後の新しいコミットがありません。この状況で feature ブランチを main にマージすると、Gitは単純に main ブランチのポインタを前に進めるだけでマージを完了します。

Fast-forwardの特徴

  • マージコミットが作成されない
  • 履歴がシンプルで直線的

Fast-forwardでのマージは、履歴をシンプルにまとめられる反面、どのブランチをいつ統合したかが分かりにくくなるという特徴があります。このような場合に、次に紹介するno-fast-forwardを使用してマージコミットを作成する方法が有効です。

2. no-fast-forward(強制的にマージコミットを作成)

Fast-forwardが可能な場合でも、--no-ff オプションを使うことで、あえてマージコミットを作成できます。これにより、ブランチの統合をより明確に記録できます。

# no-fast-forwardでマージ
git merge --no-ff feature

Fast-forwardができる状況でも、以下のような履歴になります。

E がマージコミットで、「feature ブランチを統合した」という記録が明確に残ります。

no-fast-forwardの特徴

  • マージコミットが必ず作成される
  • ブランチの統合がはっきりと見える

3. Three-wayマージ

Three-wayマージは、履歴が分岐している場合に通常のマージ(git merge)で実行されるマージ方法です。

# 以下の通常のマージはコマンドは裏側でThree-wayマージが行われる
git merge feature

git merge を実行した時、Gitは以下の判断を自動的に行います。

  1. 履歴が分岐していない場合

    Fast-forwardマージを実行(マージコミットなし)

  2. 履歴が分岐している場合

    Three-wayマージを自動実行(マージコミットあり)

3-1. Fast-forwardとThree-wayマージの違い

2つのマージ方法の違いは以下にまとめられます。

  • Three-wayマージは特別なオプションではなく、分岐した履歴での標準的なマージ方法
  • git mergeコマンドは状況に応じて自動的にFast-forwardかThree-wayかを選択
  • 開発者が意識的に選択する必要があるのは-no-ffオプションの使用時のみ

3-2. Three-wayマージの仕組み

例えば、mainブランチとfeatureブランチの両方で作業が進んでいる場合で考えてみます。

上記の場合、Gitは以下の3つのポイントを比較して、マージ結果を作成します。

  1. 共通の祖先コミットB
  2. mainブランチの最新コミットC
  3. featureブランチの最新コミットE

この3点を使って統合するため、「Three-wayマージ」と呼ばれています。

3-3. 比較表まとめ

種類条件マージコミット適用場面
Fast-forward履歴が一直線になっている作成されない個人開発、シンプルな履歴を重視
no-fast-forward--no-ffオプション使用時必ず作成されるチーム開発、統合の記録を明確にしたい
Three-way履歴が分岐している必ず作成される複数人での並行開発時

3-4. Fast-forwardとThree-wayの使い分けポイント

git merge の使い分けは、開発体制と履歴管理の目的によって決まります。個人開発では履歴をシンプルに保つFast-forwardが適しており、チーム開発では統合の記録を明確に残すno-fast-forward(--no-ff)が推奨されます。

個人開発の場合

  • Fast-forward推奨:履歴がシンプルで見やすい
  • 小さな機能追加や修正に最適

チーム開発の場合

  • no-fast-forward推奨git merge --no-ff を使用
  • 誰がいつ何を統合したかが明確
  • コードレビューの履歴も追跡しやすい

git merge --no-ff がデフォルトで実行できるように設定することも可能です。

# 設定でno-fast-forwardをデフォルトにする
git config --global merge.ff false

この3つの違いを知り、プロジェクトの規模やチームの方針に応じて、適切な方法を選択しましょう。

コンフリクトが発生した場合

マージ中にコンフリクトが起きた場合、以下の流れで対応します。

コンフリクト発生時の対処手順

  1. 競合ファイルの確認

    マージを実行しコンフリクトが発生すると、以下のようなメッセージが表示されます。競合しているファイルを確認します。(今回は、hello.txtでコンフリクトが発生しています)

    git merge feature/1
    Auto-merging hello.txt
    CONFLICT (content): Merge conflict in hello.txt
    Automatic merge failed; fix conflicts and then commit the result.

    git status を実行して、競合しているファイルを確認することも可能です。

    # 競合しているファイルを確認
    git status
    
    # 出力結果例
    On branch main
    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:   hello.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
  2. ファイルを開いて競合を解消

    コンフリクトが発生しているファイルを開き、「マージエディターで解決」を選択します。

    エディタ上でコンフリクトを解消し、マージを完了させます。

  3. 修正後にステージング

    修正したファイルをステージングします。

    # 修正したファイルをステージング
    git add ファイル名
  4. マージ処理を再開

    マージ処理を続行するため、コミットを実行します。

    # マージ処理を再開
    git commit

    テキストエディタ(VimやVSCodeなど)が開くので、そのまま :wq(保存して終了)すればOKです。

    以下のメッセージが表示され、マージでのコンフリクトが解消されました。

    git commit
    [main ec9ad07] Merge branch 'feature/1'

マージを中止したい場合

途中で中止したい場合は以下を実行します。

# マージを中止する
git merge --abort

コンフリクト発生時に使えるオプション

コンフリクト発生時に使用できるオプションを以下の表にまとめます。

オプション説明
--abort現在進行中のマージを中止し、マージ実行前の状態に戻す
--continueコンフリクトを解決し、git add でステージングした後にマージ処理を続行

補足:コンフリクトとは?

コンフリクトとは、同じファイルの同じ部分を複数のブランチで編集していた場合に、Gitが自動的に統合できなくなる状態のことです。そのままではマージできないため、開発者がどの変更を採用するか手動で判断する必要があります。

マージのコンフリクトは慣れるまでは難しく感じるかもしれませんが、慌てず手順通りに進めれば解決できます。より詳しい解説や具体例は、以下の記事でも紹介していますので、あわせてご覧ください。

Git初心者必見!マージコンフリクトの解消方法を解説

https://envader.plus/article/399


さまざまなGitコマンドを活用できるようになると、Git操作に自信がつきます。もし、Git操作が不慣れと感じている方には、次に紹介する学習方法がおすすめです。

Gitの使い方を学ぶ:おすすめの学習方法

「Gitの操作、まだちょっと不安かも…」そんな方におすすめなのが、「エンベーダー」です。 Gitの基本コマンドをはじめ、エンジニアに欠かせないLinuxの知識や操作をブラウザ上で気軽に学べる学習サービスです。

環境構築は不要。わずか5秒で学習環境が起動し、実際にコマンドを入力しながら学べるので、ゲーム感覚で楽しくスキルを習得できます

エンベーダー公式サイト - Gitの使い方コース

https://envader.plus/course/5/scenario/1055

ポイント1:コマンド入力はすべてブラウザ上で完結。実際に手を動かして学べます。

ポイント2:入力したコマンドの正誤や解説を、すぐに確認できます。

ポイント3:Gitだけでなく、Linuxやデータベース操作など、今後のキャリアに活かせる学習コースも豊富に用意されています。

エンベーダーの学習コース一覧

https://envader.plus/course

いくつかのコースは無料で体験できるため、「コマンドに慣れたい」「楽しくGitを身につけたい」という方は、ぜひ一度エンベーダーを試してみてください。

この記事で学んだこと

git merge は、Gitのブランチ同士を統合するための基本かつ重要なコマンドです。

この記事では、git merge の使い方やマージコミットの仕組み、Fast-forwardとno-fast-forwardの違い、そしてコンフリクト発生時の対処法まで、段階的に学んできました。

マージ操作は、ただコマンドを実行するだけではなく、「どのブランチに対して」「どの履歴をどう取り込むか」を理解して使うことで、チーム開発の品質と効率に大きく影響します。

これからは、ブランチの統合時に「今いるブランチがマージ先になる」「どのような履歴になるか」といった点を意識して、より自信を持って git merge を活用してしてみてください。

参考資料

以下のリンクは、この記事で解説した手順や概念に関連する参考資料です。より詳しく学びたい方は、ぜひご覧ください。

【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

IT未経験者必見 USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。

「フリーランスエンジニア」

近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。

「成功する人とそうでない人の違いは何か?」

私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。

比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。

多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、

note記事3000いいね超えの殿堂記事 LINE登録で記事を見る

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事