- Git
divergent branchesの直し方|git pullのエラー
fatal: Need to specify how to reconcile divergent branches. は、手元とリモートの両方に、相手が持っていないコミットがある状態で git pull したときのエラーです。 git は、2つの履歴をどうまとめるか(merge か rebase か)を決めるよう求めています。この時点では、何も変更されていません。
すぐに直すなら、次のどれかを実行します。
| コマンド | まとめ方 | 向いている場面 |
|---|---|---|
git pull --no-rebase |
merge(マージのコミットを作る) | チームの決まりが merge、履歴をそのまま残したい |
git pull --rebase |
rebase(自分のコミットを、リモートの後ろに付け直す) | まだ push していない自分のコミットを、一直線の履歴にしたい |
git pull --ff-only |
どちらもしない(このエラーと同じく止まる) | 手元にコミットが無いはずのとき(ずれに気づくため) |
確認環境:git 2.43.0(確認日 2026年10月11日)。2つのクローンで、片方が push したあと、もう片方でも別のファイルをコミットして再現しました。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「divergent branchesの直し方|git pullのエラー」
再現
$ git status
On branch main
Your branch and 'origin/main' have diverged,
and have 1 and 1 different commits each, respectively.
have 1 and 1 different commits:手元に1つ(自分の変更)、リモートに1つ(他の人の変更)、相手に無いコミットがあります。 これを「分岐した(diverged)」状態と呼びます。
$ git pull
hint: You have divergent branches and need to specify how to reconcile them.
hint: You can do so by running one of the following commands sometime before
hint: your next pull:
hint:
hint: git config pull.rebase false # merge
hint: git config pull.rebase true # rebase
hint: git config pull.ff only # fast-forward only
...
fatal: Need to specify how to reconcile divergent branches.
手元にコミットが無い(分岐していない)ときは、このエラーにならず、そのまま pull できました。 自分がコミットしたあとの pull だけで出るので、「昨日まで動いていた pull が突然止まった」ように見えます。git の公式ドキュメントでは、まとめ方を指定しないときの既定は --ff-only の動き(分岐していると失敗する)とされています。
3つを実行した結果の履歴
同じ状態から、3つのやり方で git pull し、git log --graph --oneline --all で比べました。
--no-rebase(merge)
* 6052e10 Merge branch 'main' of .../origin
|\
| * 1820556 r1 他の人の変更
* | df505c8 l1 自分の変更
|/
* a926f26 c1 初期
マージのコミット(Merge branch 'main' ...)が1つ増え、2本の線が合流する形になりました。自分のコミット df505c8 の ID は変わりません。
--rebase
* 127ac1a l1 自分の変更 ← ID が df505c8 から 127ac1a に変わった
* 1820556 r1 他の人の変更
* a926f26 c1 初期
自分のコミットが、他の人の変更の後ろに付け直され、一直線の履歴になりました。マージのコミットは増えません。ただし、自分のコミットの ID が変わりました(作り直されるため)。
--ff-only
hint: Diverging branches can't be fast-forwarded, you need to either:
hint: git merge --no-ff
hint: or:
hint: git rebase
fatal: Not possible to fast-forward, aborting.
分岐していると、何もせずに止まりました。 手元で誤ってコミットしていないかを、毎回確かめたい人向けの設定です。
どれを選ぶか
| 状況 | 選ぶもの |
|---|---|
| チームで決まっている | その決まりに合わせる(まずはこれを確かめる) |
| 自分のコミットをまだ push していない、一直線の履歴にしたい | --rebase |
| 自分のコミットをすでに push した(他の人が使っているかもしれない) | --no-rebase(merge) |
| main で作業しない運用(作業はブランチで行う) | --ff-only(main に誤ってコミットしたら気づける) |
rebase はコミットを作り直すので、すでに push して他の人が使っているコミットには使いません。 git の公式ドキュメントでも、他の人が使っているブランチを rebase で書き換えると、その人たちが履歴を直さなければならなくなる、と注意されています。merge と rebase の違い全体は、関連記事の「git mergeとrebaseの違い|使い分けとコンフリクト解消」で扱っています。
毎回指定しないための設定
git config pull.rebase false # このリポジトリだけ:merge
git config --global pull.rebase true # すべてのリポジトリ:rebase
| 設定 | 範囲 |
|---|---|
git config ... |
そのリポジトリだけ(.git/config) |
git config --global ... |
自分のすべてのリポジトリ(~/.gitconfig) |
コマンドの --rebase・--no-rebase |
その1回だけ(設定より優先) |
設定がぶつかって、まだ止まるとき
$ git config --show-origin --get-all pull.rebase
file:.git/config false
$ git config --show-origin --get pull.ff
file:/home/.../.gitconfig only
$ git pull
fatal: Not possible to fast-forward, aborting.
リポジトリで pull.rebase false(merge)にしたのに、--global に残っていた pull.ff only が効いて、止まりました。 以前にヒントのとおり3つとも試した、という場合に起きやすい形です。git config --show-origin で、どのファイルの設定かを確かめ、要らないほうを git config --global --unset pull.ff で消します。
rebase でコンフリクトしたとき
同じファイルの同じ行を、自分と他の人が変えていると、--rebase の途中で止まります。
Could not apply 7ed56ae... l2 a.txtを変更
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
| したいこと | コマンド |
|---|---|
| やめて、pull する前に戻す | git rebase --abort(確認環境でも元の2つのコミットに戻った) |
| 直して続ける | ファイルを直す → git add ファイル → git rebase --continue |
--abort で、pull する前の状態に戻せます。 落ち着いて merge でやり直す、という選び方もできます。コンフリクトの直し方は、関連記事の「Gitのコンフリクトの解消方法|マーカーの読み方から防ぎ方まで」で扱っています。
確認の手順(チェックリスト)
| 順番 | 確認すること | 方法 |
|---|---|---|
| 1 | 分岐しているか | git status の have diverged |
| 2 | 自分のコミットは何か | git log --oneline origin/main..HEAD |
| 3 | push 済みか | 済みなら rebase しない |
| 4 | チームの決まり | merge か rebase か |
| 5 | 設定する | git config pull.rebase false・true |
| 6 | まだ止まる | git config --show-origin で、ほかの設定を探す |
よくある質問
Q. 手元のコミットが要らないときは。
A. 自分のコミットを捨ててリモートに合わせるなら git reset --hard origin/main ですが、コミットしていない変更も含めて消えます。消す前に git log origin/main..HEAD で、何を捨てるかを確かめます。誤って消したときの戻し方は、関連記事の「git reset --hardを取り消す方法|reflogで復元する手順」で扱っています。
Q. git pull と git fetch の違いは。
A. git fetch はリモートの変更を取ってくるだけで、手元のブランチは変えません。git pull は、fetch のあとに merge か rebase を行います。このエラーは、その「あと」のやり方が決まっていないためです。違い全体は、関連記事の「git fetchとpullの違い|図解とpull --rebaseの使い分け」で扱っています。
まとめ
- 手元とリモートの両方に、相手に無いコミットがあるときのエラー。何も変更されていない
--no-rebaseは merge(マージのコミットが増える)、--rebaseは一直線(自分のコミットの ID が変わる)、--ff-onlyは止まる- push 済みのコミットは rebase しない。まずチームの決まりを確かめる
git config pull.rebase false・trueで毎回の指定が不要に。--globalとの設定のぶつかりに注意- rebase のコンフリクトは
git rebase --abortで元に戻せる
参考・出典
確認日はいずれも 2026年10月11日です。
- Git Documentation「git-pull」:https://git-scm.com/docs/git-pull
- Git Documentation「git-rebase」:https://git-scm.com/docs/git-rebase
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「divergent branchesの直し方|git pullのエラー」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。