技術 · 實用指南
Git 顯示「src refspec main does not match any」?推送前先證明本機來源
這個錯誤指向 refspec 的本機來源,不代表 GitHub 拒絕既有分支。先驗證 HEAD 是提交、refs/heads/main 確實存在,再選擇首次提交、正確分支或明確 HEAD 映射。

「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、封裝設定或獨立遠端分叉。
