git merge

別のブランチの変更を、いまのブランチへ取り込んで 1 つにまとめる。

実行前の状態

main ブランチで README.md を直したあと、別のブランチ (feature) で作っていた app.py を、main に取り込みたい場面です。2 つのブランチは、それぞれ別のコミットを持っています。

この状態を手元で作るなら、次の順に打ちます。git switch -q -c feature は、feature ブランチを作って移る操作です。

ターミナル

git init -q -b main hello
cd hello
echo "# hello" > README.md
git add README.md
git commit -q -m "README を作る"
git switch -q -c feature
echo "print('hi')" > app.py
git add app.py
git commit -q -m "app.py を足す"
git switch -q main
echo "start" >> README.md
git commit -q -a -m "README に説明を足す"

最小の例と結果

取り込む側のブランチ (main) にいる状態で、取り込みたいブランチの名前を書きます。--no-edit は、メッセージを書く画面を開かずに、自動で付くメッセージのまま記録する指定です。

ターミナル

git merge --no-edit feature
Merge made by the 'ort' strategy.
 app.py | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 app.py
  • Merge made by the 'ort' strategy は、2 つの履歴をまとめるコミット (マージコミット) を作ったという意味です。
  • app.py | 1 + は、取り込んだ変更で足された物です。

手元に別のコミットが無く、main が前へ進むだけで済むときは、マージコミットは作られず Fast-forward と出ます。

成功の確認

マージ後の履歴を図にして、2 つの流れが 1 つに合わさっていれば取り込めています。

ターミナル

git log --oneline --graph
*   a1b2c3d Merge branch 'feature'
|\  
| * 9f8e7d6 app.py を足す
* | 3c4d5e6 README に説明を足す
|/  
* 1b2c3d4 README を作る

ターミナル

git status -s

git status -s に何も出なければ、直していないファイルは残っていません。

衝突で止まったとき

同じファイルの同じ行を、両方のブランチで変えていると、自動ではまとめられず、途中で止まります。続けて、その様子を見ます。

ターミナル

echo "色は白" > color.txt
git add color.txt
git commit -q -m "色を白にする"
git switch -q -c blue
echo "色は青" > color.txt
git commit -q -a -m "色を青にする"
git switch -q main
echo "色は赤" > color.txt
git commit -q -a -m "色を赤にする"
git merge blue
Auto-merging color.txt
CONFLICT (content): Merge conflict in color.txt
Automatic merge failed; fix conflicts and then commit the result.

ターミナル

git status -s
UU color.txt

ターミナル

cat color.txt
<<<<<<< HEAD
色は赤
=======
色は青
>>>>>>> blue

UU は、両方で変えたファイルが、まだ直し終わっていないという意味です。<<<<<<< から >>>>>>> までが衝突している所で、上が main の側、下が取り込もうとした blue の側です。

直さずにやめるなら、取り込む前の状態へ戻します。

ターミナル

git merge --abort
git status -s

何も出なければ、元の状態に戻っています。

構文と主要オプション

書き方すること
git merge <ブランチ名>そのブランチの変更を、いまのブランチへ取り込む
git merge --no-edit <ブランチ名>メッセージを書く画面を開かずに取り込む
git merge --no-ff <ブランチ名>前へ進めるだけで済む場合でも、マージコミットを作る
git merge --ff-only <ブランチ名>前へ進めるだけで済むときだけ取り込む。そうでなければ何もせず止まる
git merge --abort衝突で止まっている取り込みをやめて、始める前へ戻す

失敗時の戻し方

衝突で止まっているとき

取り込みをやめるなら git merge --abort を打ちます。始める前の状態に戻ります。ただし、取り込みを始める前にコミットしていない変更があったときは、元どおりに戻らないことがあります。git merge の前に、変更をコミットしておきます。

衝突を直して続けるなら、直したファイルを git add して、git commit で終わらせます。rebase の途中でやめるのは git rebase --abort で、merge の --abort とは別のコマンドです。

マージを終えたあとで、取り消したいとき

まだ push していなければ、マージの前の位置へ戻します。ORIG_HEAD は、マージを始める前の位置を指します。

ターミナル

git reset --hard ORIG_HEAD

--hard は、作業中のファイルの変更まで消します。先に git status で、変更が残っていないかを確かめます。

push したあとなら、git revert -m 1 <マージの番号> で打ち消します。

よくある疑問

Already up to date. と出て、何も起きません

取り込もうとしたブランチの変更は、すでにいまのブランチに入っています。取り込む物が無いので、何も変わりません。

merge と rebase は、どう違いますか

merge は、2 つの履歴をまとめるコミットを足して、履歴の分かれた形を残します。rebase は、自分のコミットを相手の履歴の後ろへ付け替えて、履歴を 1 本にします。付け替えるとコミットの番号が変わるので、push したブランチには使いません。

取り込む向きを間違えました

merge は「いまいるブランチ」へ取り込みます。feature を main に入れたいなら、先に git switch main で main へ移ってから git merge feature を打ちます。まだ push していなければ、git reset --hard ORIG_HEAD で戻せます。

確かめた Git の版 2.50.1 (Apple Git-155)確認日 2026年10月17日正本は Git 公式マニュアル (英語)

Git コマンド辞典の索引へ戻る