前言
在用多台電腦開發,使用 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 指令不熟,所以快速記筆記:
- 遠端追蹤分支只用來「記錄」遠端分支的狀態,是只讀的,不是可以直接開發的真正分支
- git switch 用法:
// 切換到已存在的本地端分支
git switch <branch_name>
// 創建並切換本地分支
git switch -c <new_branch>
// 創建與遠端分支對應的本地分支,並切換
git switch -c <本地分支> <遠端分支>