fatal: refusing to merge unrelated histories は、手元で別に git init したリポジトリを、README などを入れて作った GitHub のリポジトリにつなぐと出ます。GitHub の文書は、既にあるリポジトリを持ってくるときは "To avoid errors, do not initialize the new repository with README, license, or gitignore files." と書いています(エラーを避けるため、新しいリポジトリを README・license・gitignore で初期化しない、という意味)。GitHub の代わりに、README.md だけの最初のコミットを持つリポジトリを手元に作って試すと、push は rejected で断られ、そのあと git pull --no-rebase か、git fetch のあとの git merge で、この文で止まりました(試した結果)。原因は、2 つの履歴(コミットのつながり)に共通の祖先(さかのぼると行き着く同じコミット)が無いことです。Git は、Git 2.9 から、共通の祖先を持たない履歴どうしのマージを既定で拒みます。
--allow-unrelated-histories を付けてよいのは、次の 2 つがそろうときだけです。(1) git remote -v の origin(手元の Git が GitHub 側を呼ぶ名前)の URL が、自分が GitHub で作ったリポジトリのもの。(2) git fetch origin のあと、git merge-base main origin/main が何も出さずに終わる(試した結果)。URL が別のリポジトリなら付けません。git merge-base が 40 桁のハッシュを出したら、このエラーとは別の原因です。付けると 2 つの履歴が 1 つになるので、関係のない履歴が混ざらないよう、Git は既定で拒んでいます。
手順 1:確かめる(origin/main は、git fetch origin で取ってきた GitHub 側の main です)
git remote -v
git fetch origin
git merge-base main origin/main
手順 2:直す(手順 1 で URL が自分のリポジトリ、merge-base が何も出さなかったときだけ)
git merge --allow-unrelated-histories origin/main
git push -u origin main
main は、手元のブランチ名(git branch -vv の * の行)と GitHub 側のブランチ名に替えます。CONFLICT と出たら、push の前に、下の「README.md がぶつかったら(add/add のコンフリクト)」の節へ進みます。
つまずくのは、両方に README.md があるときです。両方の側で同じ名前のファイルを足したので、マージは CONFLICT (add/add) で止まり、git pull --no-rebase --allow-unrelated-histories origin main の場合は README.md を直して git add・git commit すれば続けられました(試した結果。git merge --abort でマージの前にも戻せました)。git pull は、取り込み方を決めていないと、--allow-unrelated-histories を付けても先に divergent branches(取り込み方を決めていないための停止)で止まりました(試した結果。決め方は git pull と git fetch の記事の「止まったら、merge・rebase・fast-forward だけのどれにする?」の節)。
- 共通の祖先が無い 2 つの履歴を、
git merge(git pullの中のマージも)は既定で拒む。Git 2.9 から - 先に
git remote -vとgit merge-base main origin/mainで、つなぐ先と祖先の有無を確かめる - つなぐ先が正しいときだけ
--allow-unrelated-histories。いつも許可する設定は無い - README.md が両方にあると add/add のコンフリクトになった。
git merge --abortで戻せた(試した結果)
確かめた版は、Ubuntu 24.04 の Git 2.43.0 と、Docker の Linux(Alpine)の Git 2.54.0 です(2026年10月23日に実行しました。最新の 2.56.0 と Windows・Mac では実行していません)。GitHub に本物のリポジトリは作らず、README.md だけの最初のコミットを持つリポジトリを手元に作って、GitHub の代わりにしました。エラーとコンフリクトの文は、どちらの版でも同じでした。コミットのハッシュは、流すたびに変わる例です。出力のパスの頭と、長い hint の続きは … に省きました。
refusing to merge unrelated histories とは?
共通の祖先が無い履歴どうしは、マージを拒む
Git の文書(git-merge)は、--allow-unrelated-histories の説明で、既定ではマージを拒むと書いています。
By default, git merge command refuses to merge histories that do not share a common ancestor.
訳すと、「既定では、git merge は、共通の祖先を共有しない履歴のマージを拒む」です。共通の祖先とは、2 つのブランチの履歴をそれぞれさかのぼったときに、行き着く同じコミットのことです。git merge-base は、マージに使う、いちばんよい共通の祖先を探すコマンドだと、Git の文書にあります。
Git 2.9 から拒むようになった理由
Git 2.9(タグの日付は 2016-06-13)から、共通の祖先が無い 2 つのブランチの git merge は、既定で禁止になりました。リリースノートは、間違えて変わったマージを作らないため、と書いています。
それまでは、共通の祖先が無くてもマージできました。そのため、既存のプロジェクトの「まったく新しい履歴」が作られ、気づかないメンテナーがそれを pull して、要らない並行の履歴がプロジェクトに混ざることがあった、というのが理由です。まれな場合の逃げ道として入ったのが、--allow-unrelated-histories です。同じ 2.9 で、git pull もこのオプションを、中の git merge に渡せるようになりました。
原因:README 付きで作った GitHub と、手元の履歴が別々に始まっている
GitHub で README・.gitignore・ライセンスを入れて作ったとき
GitHub の文書(Creating a new repository)は、テンプレートを使わずに新しいリポジトリを作るとき、README・.gitignore・ライセンスを最初から入れられると説明しています。そして、既にあるリポジトリを GitHub に持ってくるなら、どれも選ばないこと、マージのコンフリクトになりうるから、と書いています。
手元のコードを GitHub に上げる手順(Adding locally hosted code to GitHub)にも、"To avoid errors, do not initialize the new repository with README, license, or gitignore files." とあります。エラーを避けるため、新しいリポジトリを README・license・gitignore で初期化しない、という意味です。足したいファイルは、push したあとで足せます。
GitHub の API(組織のリポジトリを作る API)の説明には、README で初期化すると最初のコミットを作る、とあります("Pass true to create an initial commit with empty README.")。この記事では、README.md だけの最初のコミットを持つリポジトリを手元に作って、その代わりにしました。
push・pull・merge のどこで、どの文が出るか
打ったコマンドで、止まる文が違います。出力は、手元の Git 2.43.0 と 2.54.0 のものです。
| 打ったもの | 止まったことを示す文 |
|---|---|
git push origin main(fetch の前) | ! [rejected] main -> main (fetch first) |
git push origin main(fetch のあと) | ! [rejected] main -> main (non-fast-forward) |
git pull origin main(取り込み方の設定なし) | fatal: Need to specify how to reconcile divergent branches. |
git pull --no-rebase origin main か pull.rebase false | fatal: refusing to merge unrelated histories |
git fetch origin → git merge origin/main | fatal: refusing to merge unrelated histories |
git pull --ff-only origin main か pull.ff only | fatal: Not possible to fast-forward, aborting. |
pull.rebase true | fatal は出ない(ぶつからなければ rebase が終わる) |
push は fatal ではなく rejected で止まります。Git の文書(git-push)は、rejected を「Git が送ろうともしなかった」と説明し、ふつうは fast-forward でなく、強制もしていないため、と書いています。fast-forward(手元の履歴が GitHub 側の履歴の続きになっている更新)は、更新後のコミットが更新前のコミットの子孫のときだけ、と文書にあります。
fetch のあとの push は (non-fast-forward) になり、hint(Git が添える助言の行)は「手元のブランチの先がリモート(GitHub 側)より遅れている」と読める文になります。
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. If you want to integrate the remote changes,
hint: use 'git pull' before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
ただ、実際の原因は遅れていることではなく、共通の祖先が無いことです。hint の言葉だけで原因を決めず、次の節の git merge-base で確かめます。
取り込み方を何も設定していない git pull は、unrelated の文より先に divergent branches で止まりました。仕組みと決め方は、git pull と git fetch の記事の「pull が「divergent branches」で止まるのはなぜ?」の節にあります。
断られた push を上書きして通すやり方は、この記事では扱いません。危ない理由は、取り消しの記事の「push したあとの reset・amend が危ない理由」にあります。
直す前に:つなぐ先が正しいかを確かめる
git remote -v で URL を見る
git remote -v は、origin がどの URL を指しているかを出します。
$ git remote -v
origin …/github.git (fetch)
origin …/github.git (push)
この出力は、GitHub の代わりに手元に作ったリポジトリのものです。自分の GitHub のリポジトリの URL になっているかを見ます。HTTPS と SSH の URL の違いは、GitHub の SSH の記事の「SSH と HTTPS の違いは?どっちでつなぐ?」の節にまとめました。
git merge-base で共通の祖先を探す
git fetch origin のあと、git merge-base main origin/main を実行します。共通の祖先が無いと、何も出さずに終わり、終了コードは 1 でした(試した結果で、Git の文書には書かれていません)。
$ git merge-base main origin/main
マージのあとは、ハッシュを 1 つ出して終了コード 0 になりました。
$ git merge-base main origin/main
1216229f794a000a30d1191a642b1b0ff8ec40de
git log で、1 コミット目が別かを見る
git log --oneline main と git log --oneline origin/main を並べると、どちらも 1 コミット目から別のものでした(手元の main は first commit、GitHub の代わりは Initial commit。題は、確かめた手元の例です)。
$ git log --oneline origin/main
1216229 Initial commit
直し方:--allow-unrelated-histories でマージする
git fetch して git merge する
つなぐ先を確かめたら、git fetch origin のあと、--allow-unrelated-histories を付けて git merge します。付けないと、fatal: refusing to merge unrelated histories で止まります(終了コード 128)。ぶつかるファイルが無ければ、マージは通りました。
$ git fetch origin
From …/github
* [new branch] main -> origin/main
$ git merge origin/main
fatal: refusing to merge unrelated histories
$ git merge --allow-unrelated-histories origin/main
Merge made by the 'ort' strategy.
README.md | 1 +
1 file changed, 1 insertion(+)
create mode 100644 README.md
GitHub 側の README.md が足され、履歴は 2 つの先が 1 つのマージのコミットにまとまりました。
$ git log --oneline --graph
* 89f7ea8 Merge remote-tracking branch 'origin/main'
|\
| * 1216229 Initial commit
* 4a75ebb first commit
git pull で直すなら --no-rebase と一緒に
git pull にも --allow-unrelated-histories があります。Git の文書は、説明を git-merge と同じ文にしたうえで、"Only useful when merging."(マージするときだけ役に立つ)と添えています。
ただ、取り込み方を何も設定していないと、--allow-unrelated-histories を付けても、先に divergent branches の文で止まりました(試した結果。hint の続きの行は … に省きました)。
$ git pull --allow-unrelated-histories origin main
From …/github
* branch main -> FETCH_HEAD
hint: You have divergent branches and need to specify how to reconcile them.
…
fatal: Need to specify how to reconcile divergent branches.
マージで取り込むと決めるために、--no-rebase を足します。この形なら、マージに進みました(試した結果)。取り込み方の決め方は、git pull と git fetch の記事の「止まったら、merge・rebase・fast-forward だけのどれにする?」の節にあります。
git pull --no-rebase --allow-unrelated-histories origin main
README.md がぶつかったら(add/add のコンフリクト)
手元と GitHub 側の両方に README.md があると、--allow-unrelated-histories を付けても、CONFLICT (add/add) で止まりました(終了コード 1)。add/add は、両方の側で同じ名前のファイルを新しく足したときのコンフリクトで、git status には both added と出ます。
$ git merge --allow-unrelated-histories origin/main
Auto-merging README.md
CONFLICT (add/add): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
$ 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 added: README.md
no changes added to commit (use "git add" and/or "git commit -a")
README.md には、マーカーが入りました。<<<<<<< HEAD から ======= までが手元の側、======= から >>>>>>> origin/main までが GitHub 側です。共通の行(# myapp)はマーカーの外に出ました。この例では、GitHub 側には # myapp だけがあり、手元にはその下に 2 行(空行と local README)がありました。
$ cat README.md
# myapp
<<<<<<< HEAD
local README
=======
>>>>>>> origin/main
git pull --no-rebase --allow-unrelated-histories origin main で同じコンフリクトになったときは、README.md を直して git add README.md し、git commit --no-edit すると、マージのコミットができました(試した結果)。ファイルの直し方の全体は、コンフリクトの記事の「コンフリクトが起きたら?ぶつかったファイルとマーカーの読み方」の節にあります。
マージをやめて、前に戻したいときは git merge --abort です。試すと、マージの前の状態に戻りました(git status --short --branch は ## main)。やめ方は、同じ記事の「やめて元に戻すには?(--abort)」の節にもあります。
この pull のあとは、git merge-base main origin/main が GitHub 側の最初のコミットを返すようになりました。
マージのあとに push する
pull でマージして、README.md を直してコミットしたあとは、git push -u origin main が通りました。-u で、追跡する先(upstream)の設定もできました。
$ git push -u origin main
To …/github.git
1216229..262bdfe main -> main
branch 'main' set up to track 'origin/main'.
このあとプルリクエストを作るなら、プルリクエストの記事の「プルリクエストを作る前に何をする?(ブランチ・コミット・push)」の節へ進みます。
rebase で取り込む設定のときは(試した結果)
pull.rebase true にして git pull origin main すると、この文は出ず、ぶつかるファイルが無ければ、手元のコミットが GitHub 側の 1 コミット目の上に載り直して一本の履歴になりました(試した結果で、rebase で通ることを書いた文書は確かめていません)。README.md が両方にあると、rebase の途中で CONFLICT (add/add) になって止まり(終了コード 1)、git rebase --abort で戻せました。rebase のコンフリクトは、コンフリクトの記事の「pull でコンフリクトしたら」の節で説明しています。
次から起こさないには?
手元のコードを GitHub に上げるときは、GitHub で README・license・gitignore を入れずに新しいリポジトリを作ります。GitHub の文書がそう書いています(上の「GitHub で README・.gitignore・ライセンスを入れて作ったとき」の節)。足したいファイルは、push したあとで足せます。
README を入れる欄の名前は、GitHub の文書で 2 通りに書かれています。クイックスタート(Quickstart for repositories)は「Add README を On にする」、Hello World のチュートリアルは「Add a README file を選ぶ」です。
よくある質問
いつも許可する設定(config)はありますか?
ありません。Git の文書は、"no configuration variable to enable this by default exists or will be added." と書いています。いつも許可にする設定は無く、これからも足さない、という意味です。毎回オプションで付けます。
git pull でも --allow-unrelated-histories は使えますか?
使えます。Git 2.9 で、git pull がこのオプションを中の git merge に渡せるようになりました。ただ、取り込み方を決めていないと、先に divergent branches の文で止まりました(試した結果)。--no-rebase と一緒に付けます。
テンプレートから作ったリポジトリとは、プルリクエストやマージができないのですか?
GitHub の文書(Creating a repository from a template)は、"Branches created from a template have unrelated histories, which means you cannot create pull requests or merge between the branches." と書いています。テンプレートから作ったリポジトリのブランチは、テンプレートと関係のない履歴になり、そのあいだではプルリクエストもマージもできない、という意味です。
Ubuntu の日本語の環境でも英語で出ますか?
Git 本体には日本語の訳がありません。Git の翻訳(po/ フォルダ)に日本語のファイルは無く、翻訳チームの一覧にも日本語がありません。Ubuntu 24.04 で日本語の訳(language-pack-ja)を入れて LANG=ja_JP.UTF-8 の環境にしても、この文は英語のままでした(試した結果)。日本語になったのは、git status の On branch が ブランチ になるなど、別の 2 つの文だけでした。
まとめ
- 共通の祖先が無い 2 つの履歴を、
git merge(git pullの中のマージも)は既定で拒む。Git 2.9 から - 先に
git remote -vで origin の URL を見て、git merge-base main origin/mainで祖先の有無を確かめる。何も出なければ祖先は無い(試した結果) - つなぐ先が正しく、2 つを 1 つにしてよいときだけ
--allow-unrelated-historiesを付ける。いつも許可する設定は無い git pullで直すなら、--no-rebaseと一緒に付ける。取り込み方を決めていないと、先にdivergent branchesで止まった- README.md が両方にあると add/add のコンフリクトになった。
git merge --abortで戻せた - この記事で確かめていないこと: 本物の GitHub での表示、Windows・Mac の Git、Git 2.56.0、2.8 以下の動き
参考資料
- git-merge(Git 公式の文書)
- git-pull(Git 公式の文書)
- git-push(Git 公式の文書)
- git-merge-base(Git 公式の文書)
- Creating a new repository(GitHub Docs)
- Adding locally hosted code to GitHub(GitHub Docs)
- Quickstart for repositories(GitHub Docs)
- Hello World(GitHub Docs)
- REST API endpoints for repositories(GitHub Docs)
- Creating a repository from a template(GitHub Docs)
※この記事は、2026年10月23日時点の公式の資料と照らして確かめています。誤りに気づいたらお問い合わせからお知らせください。



