解決 Git 的 ambiguous 分支警告的坑

更新 發佈閱讀 4 分鐘

前言

在用多台電腦開發,使用 Git 時遇到了奇怪的警告,因此想記錄一下原因與解決方法~

先上這個奇怪的警告:

warning: refname 'origin/develop' is ambiguous.

雖然這不是一個錯誤,但是可能會造成程式執行不如預期! 還是要好好地把問題解決~


背景情境

我用兩台電腦進行同一專案:

A 電腦創建develop 分支並推到 github上

B 電腦用 git pull 將分支拉下來

用 B 電腦 git remote 查看,出現:

origin/HEAD -> origin/main // 遠端預設分支指向 main
origin/develop // 本地的遠端追蹤分支
origin/main // 本地的遠端追蹤分支
這裡的 origin/develop 與 origin/main 是遠端追蹤分支,遠端追蹤分支是本地 Git 用來記錄遠端倉庫分支狀態的本地參考,不是可以直接開發的本地分支 (但此時我還不知道)

錯誤操作

因為沒有遠端追蹤分支的概念,也不太熟悉 git switch 語法,所以想要切換分支時打成了:

git switch -c origin/develop (這是錯誤的不要學!!)

這邊的 -c 是本地端創建新分支的意思,所以我其實是:

  • 本地生成一個錯誤的 origin/develop ​分支
  • 與遠端追蹤分支產生命名衝突
  • 導致切換分支出現 warning: refname 'origin/develop' is ambiguous. 這樣的警告

問題分析

執行 git show-ref | Select-String develop 看到:

...hash... refs/heads/origin/develop    // 本地分支
...hash... refs/remotes/origin/develop // 遠端追蹤分支

因為不正確使用遠端分支名稱創建本地分支,導致 Git 讀到兩個同名 ref ,產生 ambiguous


解決方法

先切換回 main ,刪掉混淆的兩個分支

git switch main
git branch -D origin/develop // 刪除本地分支
git branch -dr origin/develop // 刪除遠端追蹤分支

接著重新 fetch 下來! 要注意這邊是要用 fetch,因為我只是要娶的分支的最新狀態,沒有要合併 code,所以保險的做法是透過 git fetch 取得乾淨的遠端資訊~

最後再用正確的語法重新建立分支

git switch -c develop -- track origin/develop

    • --track 讓本地端分支追蹤後方的分支,如果用 git pull 或 git push 不特別指定分支都會推到後方這個 origin/develop
    • --track 也可以省略,直接寫成 git switch -c <本地端分支> <遠端分支>

重新執行看看程式是不是符合預期的執行,這樣就大功告成啦~🎉


總結

這次的問題其實是因為沒有遠端追蹤分支的觀念以及對於 git switch 指令不熟,所以快速記筆記:

  1. 遠端追蹤分支只用來「記錄」遠端分支的狀態,是只讀的,不是可以直接開發的真正分支
  2. git switch 用法:
// 切換到已存在的本地端分支​
git switch <branch_name>
// 創建並切換本地分支
git switch -c <new_branch>
// 創建與遠端分支對應的本地分支,並切換
git switch -c <本地分支> <遠端分支>
留言
avatar-img
Elaine 粼粼的林林總總
10會員
40內容數
不定期地分享程式/旅遊/學習/閱讀或各式各樣的文章,如果對我的分享有興趣,歡迎來找我玩~