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

技術 · 實用指南

Git 顯示「src refspec main does not match any」?推送前先證明本機來源

這個錯誤指向 refspec 的本機來源,不代表 GitHub 拒絕既有分支。先驗證 HEAD 是提交、refs/heads/main 確實存在,再選擇首次提交、正確分支或明確 HEAD 映射。

原創技術圖:依序驗證 HEAD、精確本機分支引用與明確推送映射。
原創插畫:選擇 push 命令前先證明來源物件與本機引用。 Watch at Ease

「src refspec main does not match any」表示 Git 無法解析推送命令左側的本機來源。它不等於遠端已有衝突的 main、驗證失敗或必須強推。

保留原命令,然後在本機證明兩件事:HEAD 能解析為提交,而且命令指定的來源引用確實存在。之後才決定首次提交、推送實際分支、謹慎改名或把 HEAD 明確映射到遠端目標。

保留命令並證明 HEAD

保存完整 push 命令、儲存庫路徑、git status --short --branch、git branch --show-current 與 git remote -v。腳本可能寫死 main,但本機實際是 master、其他名稱或 detached HEAD。

執行 git rev-parse --verify HEAD^{commit}。若新儲存庫失敗,先審查檔案,只暫存應進入歷史的內容並建立真正首次提交;不要盲建空提交。

核對精確的本機來源引用

命令指定 main 時執行 git show-ref --verify refs/heads/main。非零表示這個本機分支不存在,即使遠端追蹤引用或標籤含有 main。

比較 git symbolic-ref --short -q HEAD 與 git branch --show-current。若目標提交位於其他本機分支,推送它或有意識地改名,不要假設平台預設分支會自動改寫本機引用。

需要時使用明確映射

若 HEAD 已解析為正確提交但不該建立本機 main,可使用 git push -u origin HEAD:refs/heads/main。左側是已證明來源,右側是遠端分支。

若確實需要本機 main,先確認它應指向哪個提交再建立或改名,並重跑 show-ref 與 git log -1 --decorate。

把遠端拒絕分到另一條路徑

若 Git 已連線遠端並回報 non-fast-forward,本機來源其實已解析。先 fetch,檢查分叉,再依儲存庫政策整合。

不要用 --force 修復「does not match any」。force 無法建立缺失來源,卻可能覆寫錯誤分支的遠端歷史。

驗證結果並收尾

只做一項窄修正後再推送一次,完整閱讀輸出,確認來源、目標、-u 上游與 git rev-parse HEAD 的提交 ID。

檢查 git status --short --branch 與 git ls-remote --heads origin main,記錄根因是未出生歷史、分支名錯誤、detached HEAD、封裝設定或獨立遠端分叉。

原創決策圖:區分無提交歷史、缺失本機分支、明確 HEAD 映射與遠端拒絕。
原創插畫:本機來源缺失與遠端 non-fast-forward 是不同故障。 Watch at Ease