[教學] git應用-無法更新遠端分支 - 討論區

[教學] git應用-無法更新遠端分支

文章瀏覽次數 1724 文章回覆數 0

特種兵

特種兵圖像(預設)

2021-05-02 11:26:35

From:1.161.141.36

嚴格說來,不是無法更新遠端分支,而是查看遠端分支的 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: 加入新增、修改與刪除功能                                           

終於搞定了,可能技術細節我不是解釋的很清楚,可以看一下 這篇