Watch at Ease看見世界,讀懂生活。

技術 · 實用指南

Git 顯示「refusing to merge unrelated histories」?先證明提交圖,再決定是否放行

不要先加 --allow-unrelated-histories。先核對 repository、remote、root commits 與 merge-base;接錯 repository 就更正,確實要保留兩條獨立歷史才做有備份的合併。

原創 Git 圖示,展示凍結、識別、merge-base 與決策。
原創插畫:先證明身份與祖先。 Watch at Ease

此錯誤表示 Git 在兩條待合併歷史間找不到共同祖先,並不代表兩者一定應合併,也不證明 remote 正確或本地圖完整。

先保留現場並證明身份:核路徑、remote、root commits 與 merge-base;之後只更正錯誤連線,或明確保留兩個專案。

變更歷史前凍結證據

保存命令、路徑、git status --short --branch、git remote -v 與提交圖;先建立備份或保護 branch。

確認本地 commits、未追蹤檔案與 secrets 的邊界。

證明 repository 身份與祖先

核對 remote URL、fetch 目標 refs,檢查 tips 與 roots;錯誤路徑、origin、淺 clone 或雙初始化都可能誤導。

執行 git merge-base A B 並檢查結果。有 base 先查 refs/fetch;沒有 base 也不等於自動允許合併。

決定兩條歷史是否都屬於結果

一邊只是 README 或錯誤 repository 時,更正 remote/path 或移入乾淨 clone,驗證前保留舊目錄。

兩個專案都需追溯時,先定義最終目錄、所有權和衝突政策;必要時採 subtree。

刻意使用例外合併

保存變更、建立保護 branch 並 fetch 正確 tip;只在兩條 root histories 都該保留時使用 flag。

逐項審查 conflicts 與 staged tree;異常碰撞或檔案外洩就 abort。

驗證並記錄

檢查 merge commit 的兩個 parents、測試與最終 tree,push 前確認 remote 與保護規則。

記錄原 tips、merge-base、備份與決策;身份仍不清楚就停止並聯絡 owner。

原創決策圖,區分身份修正與保留兩條歷史。
原創插畫:只有兩條歷史都應保留才放行。 Watch at Ease