嚴格說來,不是無法更新遠端分支,而是查看遠端分支的 log 時發現位置不正確。
因此以為無法順利更新成功,這也是我後來處理好問題才查覺的。
那天快要下班時把測試專案 dev 分支推上主機,打算放假有空時可以抓回來繼續寫
雖然順利推上主機了,但卻發現本地端查看遠端分支的結果與主機端居然不同。
# 本地端的 windows
$ git log -1 origin/dev
commit c54e8059aed118a6ff6b6b80ea8cfde014c5076a
Author: Logo-Kuo <logo@forblind.org.tw>
Date: Fri Apr 30 21:36:40 2021 +0800
type: feature
system: calendar
scope: self/controller/model/js/view
subject: 加入新增、修改與刪除功能
以上是正確且最新的紀錄無誤,為了保險,我又進到主機的測試環境下同樣的指令:
# 主機的測試環境
$ git log -1 origin/dev
warning: refname 'origin/dev' is ambiguous.
commit 9ea4b3cd0be7c9b30e2eef8d2044e939a807f7b9 (origin/dev)
Author: Logo-Kuo <logo@forblind.org.tw>
Date: Mon Jan 25 15:00:36 2021 +0800
type: feature
system: leave
scope: self/controller/model/view/js
subject: 新增前臺查詢部門同仁留停紀錄功能
明明有推上去,而且大家參考的都是同一個 repo 為什麼在主機看到的遠端分支結果卻是很舊的紀錄?
然後還有個警告訊息在上面。
我想到兩個解決問題的方向:
第一,先 google 這個警告訊息有什麼收穫。
warning: refname 'origin/dev' is ambiguous.
$ git branch -l
# 看到了所有本地與遠端分支,看起來沒問題
從 stack overflow 查到的結果應該是跟指向的 repo 有關,提供了一個指令修復:
git branch --set-upstream-to=refs/remotes/origin/dev dev
我沒有直接下這個指令來修改設定,因為,我想比較兩邊的 git config 設定有什麼差別:
分別打開了三個地方的 .git/config 檔案來比較看看,僅列出重要部分:
# 本地端 windows (正常)
[remote "origin"]
url = logo@192.168.11.22:/xxx/yyyy
fetch = +refs/heads/*:refs/remotes/origin/*
# 主機端 正式環境 正常
[remote "origin"]
url = 192.168.11.22:/xxx/yyyy
fetch = +refs/heads/*:refs/remotes/origin/*
# 主機端 測試環境 不正常
[remote "origin"]
url = 127.0.0.1:/xxx/yyyy
fetch = +refs/heads/*:refs/remotes/origin/*
兩個主機端因為是多人開發環境,所以沒有指定帳號上傳,但本地端只有我自己開發,就直接指定自己的帳號。
看起來測試環境是指向 127.0.0.1 而其他環境是指向主機 ip 192.168.11.22
但理論上主機端的 127.0.0.1 應該就等同於主機對外的私有 ip 才對
repo 的位置則是都一樣,那就先手動將測試環境的 127.0.0.1 改成 192.168.11.22 看看
改好後使用 git 來更新所有遠端分支:
$ git remote update
# 輸入完密碼
Fetching origin
$ git log -1 origin/dev
warning: refname 'origin/dev' is ambiguous.
commit 9ea4b3cd0be7c9b30e2eef8d2044e939a807f7b9 (origin/dev)
Author: Logo-Kuo <logo@forblind.org.tw>
Date: Mon Jan 25 15:00:36 2021 +0800
type: feature
system: leave
scope: self/controller/model/view/js
subject: 新增前臺查詢部門同仁留停紀錄功能
不妙,看起來還是舊的紀錄。
再次查看 .git/config 看起來都差不多。
沒辦法,試看看 stack overflow 的指令好了:
$ git branch --set-upstream-to=refs/remotes/origin/dev dev
Branch 'dev' set up to track remote branch 'dev' from 'origin'.
$ git remote update
# 輸入密碼
Fetching origin
$ git log -1 origin/dev
# 結果一樣,但是
$ git status
On branch dev
Your branch is behind 'remotes/origin/dev' by 5 commits, and can be fast-forward
ed.
(use "git pull" to update your local branch)
nothing to commit, working tree clean
有希望,我的確是落後最新版的 5 個 commit, 而且對應的遠端分支 remotes/origin/dev
也是對的,那就拉拉看,且要連標籤一起::
$ git pull origin dev --tags
23 files changed, 1234 insertions(+), 253 deletions(-)
太好了,再次查看遠端分支:
$ git log -1 origin/dev
# 還是舊的
但本地端 log 是正確的:
$ git log -1
commit c54e8059aed118a6ff6b6b80ea8cfde014c5076a (HEAD -> dev, origin/dev)
Author: Logo-Kuo <logo@forblind.org.tw>
Date: Fri Apr 30 21:36:40 2021 +0800
type: feature
system: calendar
scope: self/controller/model/js/view
subject: 加入新增、修改與刪除功能
所以,現在查看遠端分支的資訊不正確,有點像是遠端分支的參考位置不對。
而實際 pull/push 的資訊是對的,也就是推拉時參考的是正確的位置。
其實只要推拉正常就沒什麼大問題,但我還是覺得應該修好它才對。
再次查看 stack overflow 之後,操作如下:
# 因為主分支是正常的,所以觀察主分支 master 的 ref
$ git show-ref master
c5144a4a1b8f585da25294b0018b8804c0d0093c refs/heads/master
bdc279d78ee1511b5efa17a0b9029ed01b6284ab refs/remotes/origin/master
# 再觀察有問題的 dev 分支
$ git show-ref dev
c54e8059aed118a6ff6b6b80ea8cfde014c5076a refs/heads/dev
9ea4b3cd0be7c9b30e2eef8d2044e939a807f7b9 refs/heads/origin/dev
c54e8059aed118a6ff6b6b80ea8cfde014c5076a refs/remotes/origin/dev
看來 refs/heads/origin/dev 是多的,造成在更新時無法兩邊同步,或者是讓它找錯資訊了。
我在本機查詢,也是沒有這個,那就:
# 把它刪掉
$ git update-ref -d refs/heads/origin/dev
$ git show-ref dev
c54e8059aed118a6ff6b6b80ea8cfde014c5076a refs/heads/dev
c54e8059aed118a6ff6b6b80ea8cfde014c5076a refs/remotes/origin/dev
看起來正常了,那就再更新試看看:
$ git remote update
# 輸入密碼
# 沒有資訊,因為本來就是對的,剛剛只是把位置換好而已
$ git log -1 origin/dev
commit c54e8059aed118a6ff6b6b80ea8cfde014c5076a (HEAD -> dev, origin/dev)
Author: Logo-Kuo <logo@forblind.org.tw>
Date: Fri Apr 30 21:36:40 2021 +0800
type: feature
system: calendar
scope: self/controller/model/js/view
subject: 加入新增、修改與刪除功能
終於搞定了,可能技術細節我不是解釋的很清楚,可以看一下 這篇