
はじめに
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 merge
と git 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 | マージコミットを必ず作る(履歴を明確に) |
--ff | Fast-forwardマージが可能な場合にのみ実行(デフォルトの動作) |
--ff-only | Fast-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は以下の判断を自動的に行います。
-
履歴が分岐していない場合
→ Fast-forwardマージを実行(マージコミットなし)
-
履歴が分岐している場合
→ 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つのポイントを比較して、マージ結果を作成します。
- 共通の祖先コミット(B)
- mainブランチの最新コミット(C)
- 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つの違いを知り、プロジェクトの規模やチームの方針に応じて、適切な方法を選択しましょう。
コンフリクトが発生した場合
マージ中にコンフリクトが起きた場合、以下の流れで対応します。
コンフリクト発生時の対処手順
-
競合ファイルの確認
マージを実行しコンフリクトが発生すると、以下のようなメッセージが表示されます。競合しているファイルを確認します。(今回は、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")
-
ファイルを開いて競合を解消
コンフリクトが発生しているファイルを開き、「マージエディターで解決」を選択します。
エディタ上でコンフリクトを解消し、マージを完了させます。
-
修正後にステージング
修正したファイルをステージングします。
# 修正したファイルをステージング git add ファイル名
-
マージ処理を再開
マージ処理を続行するため、コミットを実行します。
# マージ処理を再開 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やデータベース操作など、今後のキャリアに活かせる学習コースも豊富に用意されています。
エンベーダーの学習コース一覧
いくつかのコースは無料で体験できるため、「コマンドに慣れたい」「楽しくGitを身につけたい」という方は、ぜひ一度エンベーダーを試してみてください。
この記事で学んだこと
git merge
は、Gitのブランチ同士を統合するための基本かつ重要なコマンドです。
この記事では、git merge
の使い方やマージコミットの仕組み、Fast-forwardとno-fast-forwardの違い、そしてコンフリクト発生時の対処法まで、段階的に学んできました。
マージ操作は、ただコマンドを実行するだけではなく、「どのブランチに対して」「どの履歴をどう取り込むか」を理解して使うことで、チーム開発の品質と効率に大きく影響します。
これからは、ブランチの統合時に「今いるブランチがマージ先になる」「どのような履歴になるか」といった点を意識して、より自信を持って git merge
を活用してしてみてください。
参考資料
以下のリンクは、この記事で解説した手順や概念に関連する参考資料です。より詳しく学びたい方は、ぜひご覧ください。
-
Git公式ドキュメント - git-merge
-
Git公式ドキュメント - 3.2 Git のブランチ機能 - ブランチとマージの基本
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

関連記事

2025.06.27
git checkout と git switch それぞれの使い方を比較する
この記事では、switchコマンドの基本的な使い方と機能を紹介します。また、checkoutコマンドとの比較を行い、両者の違いとそれぞれのコマンドが適した使用状況について解説します。最後に、switchコマンドを使った実践的な使用例とベストプラクティスを提供します。
- PC操作
- git

2024.05.04
実は便利なGitコマンドgit fetchとは?git pullとの関係もあわせて解説!
今回は「git fetch」を解説します。あまり馴染みのないコマンドかもしれませんが、実はgit pullと関係のあるコマンドです。
- git

2025.06.26
git revertとgit resetの違い|push前後で使い分けるコミット取り消し術
Gitのコミット取り消しで迷う方へ。git revertとgit resetの違いを「push済みか」を基準に徹底解説。シーン別の使い方や各コマンドのオプションも紹介し、安全な選択をサポートします。
- プログラミング
- インフラエンジニア
- git

2024.05.27
Gitコマンドでバグが混入したコミットを見つける!便利な「git bisect」コマンドを徹底解説
バグの原因となったコミットが何なのか最速で知りたい!という方向けに、この記事では「git bisect」コマンドについて解説します。
- git