
ブランチで分けた作業を最後に「ひとつにまとめる」作業、それが「マージ(merge)」です。 しかし、うまくいかないと「コンフリクト(衝突)」が発生することも。この章では、マージの基本から、もしコンフリクトしたときの対処法まで丁寧に解説します。
git merge
:変更をひとつに統合する
git merge ブランチ名
git merge
は、別のブランチで行った変更を現在のブランチに取り込む操作です。これにより、複数人が分担して行った作業や、異なる機能ごとのブランチが1つにまとまり、最終的な成果物として完成に近づけることができます。
- 現在のブランチがマージ先になります。間違えて意図しないブランチで
merge
を行うと、統合先がズレてしまうので注意しましょう。 - 通常のマージでは、
git commit
を手動で行う必要はありません。Gitが自動で「マージコミット」を作成します。
実際に、下記の手順で「git merge
」コマンドを利用してみましょう。
手順 | 作業ブランチ | 動作 |
---|---|---|
1 | main | 適当なフォルダ内で「git init」を実行してgit管理のフォルダにする ※「git-sample」フォルダを作成 |
2 | main | 「git-sample」内に適当なファイルを作る ※「memo.txt」のファイルを作成 |
3 | main | 「git add」と「git commit」を行なって「memo.txt」のファイルをmainの履歴に登録する |
4 | main→develop | checkout |
5 | develop | 「memo.txt」のファイルに適当な文字列を追加 |
6 | develop | 「git add」と「git commit」を行なって「memo.txt」のファイルの修正をdevelopの履歴に登録する |
7 | develop→main | checkout |
8 | main | git merge developでdevelopの修正をmainに取り込んでマージする |

コマンドでは下記のようになります。
# 現在のブランチがmainであることを確認
git-sample % git branch
* main
# mainのmemo.txtの中身を表示
git-sample % cat memo.txt
こんにちは。tamotechさん
# developブランチを作成後、チェックアウト
git-sample % git checkout -b develop
Switched to a new branch 'develop'
# ここでdevelop上のmemo.txtを編集
git-sample % open memo.txt
# developの修正後のmemo.txt を表示
git-sample % cat memo.txt
こんにちは。tamotechさん
今日も素晴らしい1日ですね。
# developのstatusを確認
git-sample % git status
On branch develop
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: memo.txt
no changes added to commit (use "git add" and/or "git commit -a")
# addとcommit
git-sample % git add memo.txt
git-sample % git commit -m "memo.txtの修正"
[develop 737f215] memo.txtの修正
1 file changed, 1 insertion(+)
# mainにcheckout
% git checkout main
Switched to branch 'main'
# developをmainにマージ
git-sample % git merge develop
Updating faa0d51..737f215
Fast-forward
memo.txt | 1 +
1 file changed, 1 insertion(+)
# mainブランチのmemo.txtが修正されていることを確認
git-sample % cat memo.txt
こんにちは。tamotechさん
今日も素晴らしい1日ですね。
git-sample %
回りくどいことをやっていますが、非常に重要な操作です。しっかり理解しておきましょう。
コンフリクトとは?
コンフリクト(conflict)とは、マージを行った際に、同じファイルの同じ箇所が別々のブランチで異なる内容に変更されていた場合に発生する衝突です。
Gitは通常、異なるファイルや異なる行の変更は自動的に統合できますが、同じ行に対して複数の変更がある場合は、どちらの内容を採用すべきか判断できません。 その結果として、開発者が手動で修正する「コンフリクト解消」が必要になります。
- 同じファイルでも「異なる行」の変更であればコンフリクトしないことが多い
- 「同じ行」を複数のブランチで書き換えるとコンフリクトする可能性が高い

では実際にコンフリクトを起こして修正してみましょう。先ほどの「git-sample」の「memo.txt」を異なるブランチから同時に修正してみます。下記の手順でコンフリクトを発生させます。
手順 | 作業ブランチ | 動作 |
---|---|---|
1 | main→fearture1 | checkout |
2 | fearture1 | memo.txtを修正する 「今日も素晴らしい1日ですね。」→「今日は大変な1日でした。」 |
3 | fearture1 | 「git add」と「git commit」を行なって「memo.txt」のファイルの修正を履歴に登録する |
4 | fearture1→main | checkout |
5 | main→fearture2 | checkout |
6 | fearture2 | memo.txtを修正する 「今日も素晴らしい1日ですね。」→「明日も素晴らし1日になるでしょう」 |
7 | fearture2 | 「git add」と「git commit」を行なって「memo.txt」のファイルの修正を履歴に登録する |
8 | fearture2→main | checkout |
9 | main | fearture1をマージ |
10 | main | fearture2をマージ |
11 | main | ⚠️⚠️⚠️⚠️⚠️コンフリクト発生!!⚠️⚠️⚠️⚠️⚠️ |
12 | main | コンフリクトしたmemo.txtを修正する |
13 | main | 「git add」と「git commit」を行なって「memo.txt」のファイルの修正を履歴に登録する |
こんにちは。tamotechさん
<<<<<<< HEAD
今日は大変な1日でした。
=======
明日も素晴らし1日になるでしょう
>>>>>>> feature2
上記の手順でコンフリクトを発生させるとmainブランチでのmemo.txtは上記のような表示になります。HEAD(現在のブランチの行)とfeature2で変更された行が表示されます。必要な部分は残しておいて、不要なものは削除して修正しましょう。
解消方法の概要:
- 上記の区切り記号(
<<<<<<<
,=======
,>>>>>>>
)を削除 - 採用したい内容を残して保存
- 修正したファイルを
git add
してからgit commit
💡 コンフリクトはあくまで「人間の判断が必要な状態」であり、Gitのエラーではありません。チーム開発では日常的に起こるため、落ち着いて対処すれば問題ありません。
🚫 注意!この記事ではあえて main でコンフリクトを修正していますが、実務では main ブランチに直接マージ&修正は行いません。 feature2にfeature1またはmainの修正をとりんでから、feature2の修正をmainにマージしましょう。
マージせずにブランチを戻したいとき
git merge --abort
マージを途中でやめたいときに使うのが git merge --abort
です。
これは、マージ中にコンフリクトが発生した場合に限り有効で、マージ前の状態にロールバック(元に戻す)してくれます。
主な使いどころ:
- コンフリクトが複雑で一旦やり直したい
- 間違って違うブランチをマージしようとしてしまった
⚠️ 注意:
--abort
は「マージを開始したけれどまだ完了していない」状態でのみ使えます。 コミットまで終わった後には使えません。
まとめ
git merge
でブランチを統合できる- 編集箇所が重なるとコンフリクトが発生する
- 落ち着いて修正すれば問題なく解消できる