今天整理之前的老項目,發(fā)現(xiàn)前期遺留下很多無用分支,于是,有點強迫癥的我就刪刪刪,刪出了下列這個錯誤:
當時嚇了我一跳,以為自己不小心錯誤操作了什么,然而并不是,刪除其他的分支還是正常的,就是只有其中一個分支不行。
然后我 Google 了這個問題,果然遇到錯誤的不是我一個人(這個心理活動,真的每次都會有····)
error: dst refspec dev_test matches more than one.
當遠程倉庫同時存在相同名稱的 branch 和 tag 時,不指明絕對路徑的前提下,操作這個名稱的 branch 和 tag 都會出現(xiàn)這個問題。
解決方法很簡單,指明操作對象的絕對路徑就能準確操作了
對象 | 路徑 |
---|---|
branch | refs/heads/branch_name |
tag | refs/tags/tag_name |
//刪除 dev_test 分支git push origin :refs/heads/dev_test//刪除 dev_test 標簽git push origin :refs/tags/dev_test
error: dst refspec dev_test matches more than one.
其實,仔細看看返回的錯誤提示,基本都明白了。(是的,其實當時我沒看懂)
上面的提示指出失敗原因是 在 refspec 中 ,dev_test
這個名字,對應了多個。
于是,我就去項目的 .git/refs
中看了一下,果然如此
我承認,我有病,一種非要自己試試才能相信的病,特別是,最近剛開始用 git 命令行 ,總想自己敲敲敲,感覺很爽。
我準備創(chuàng)建一個叫 dev_test
的分支和標簽,然后刪除一下試試看,重現(xiàn)錯誤。
我腦海中的重現(xiàn)命令行是這樣的:
1.git branch branch dev_test //創(chuàng)建本地分支 dev_test2.git push origin dev_test //創(chuàng)建遠程分支 dev_test3.git tag dev_test //創(chuàng)建本地標簽 dev_test4.git push origin dev_test //創(chuàng)建遠程標簽 dev_test5.git push origin :dev_test //刪除遠程分支 dev_test//然后出現(xiàn)錯誤
事實是到到第4步就出現(xiàn)了這個錯誤,如下:
那我真是好奇了,當初我們的開發(fā)是怎么做到,把相同的分支和標簽給推上去遠程的?
參考問題的解決方法,我嘗試使用完成路徑推送,果然成功了,命令如下:
git push origin refs/tags/dev_test
好吧,到這里,下面的刪除遠程 dev_test
命令,我用眉毛想都知道百分之百會報錯。
# 總結(jié)
重現(xiàn)問題的過程中,對 git 的認知又更加清楚了一點。
一是,git 真的很智能,當我們使用 git push origin <name>
的時候,會自動判斷 <name>
在本地版本中是 branch 還是 tag ,然后分別推送對應的位置。
二是,第一次對.git
文件夾中的目錄結(jié)構(gòu)和對應的內(nèi)容感覺到一種非常強烈的好奇,好想知道 git 是怎么把代碼管理的這么井井有條,使用起來這么方便的。
三是,Linus Torvalds 真是太強大了。
加油!
測試完之后,我試圖刪除這個遠程倉庫用來測試的dev_test
分支,但是遇到了一個新的錯誤,如下:
原因是因為當時dev_test
是遠程倉庫的默認分支,無法刪除,去 github 把遠程倉庫的默認分支修改一下就好了。
具體見: Git- [!remote rejected]:refusing to delete the current branch
–