[英]git branch -r shows different remote shared repo in different local working directory
我創建了一個共享倉庫,然后將其克隆到兩個文件夾(A和B)中。 所有都在同一台電腦上。
現在有兩個分支, master
和v0
。 文件夾A和B現在位於分支v0
。 在AI上刪除了遠程倉庫上的v0
分支。
$ git push origin --delete v0
To file:///home/nanger/github/shared1.git
- [deleted] v0
然后我嘗試在A和B上拉動遠程倉庫(在分支v0
):
現在,我明白了
在A:
$ git pull
Already up-to-date.
$ git branch -r
origin/master
$ git branch
* master
v0
在B上:
$ git pull
Already up-to-date
$ git branch -r
origin/HEAD -> origin/master
origin/master
origin/v0
$ git branch
* master
v0
為什么A和B對遠程倉庫有不同的看法?
git pull
不會刪除跟蹤遠程不再存在的遠程分支的本地遠程跟蹤分支,例如origin/v0
。
如果要從本地存儲庫中刪除過時的遠程跟蹤分支,則需要使用
git fetch <remote> --prune
# Or shorter
git fetch <remote> -p
從Jan的鏡像官方git fetch
docs :
-p --prune
獲取后,刪除遠程不再存在的任何遠程跟蹤引用。 如果僅由於默認標記自動跟蹤或由於
--tags
選項而提取標記,則不對其進行修剪。 但是,如果由於顯式refspec(在命令行或遠程配置中,例如,如果使用--mirror
選項克隆遠程)而--mirror
,則它們也會受到修剪。
如果你想要更詳細地解釋Git中不同類型的分支(本地,遠程和遠程跟蹤),以及如何刪除它們,你可以在我如何刪除Git分支的答案中閱讀所有這些內容。 本地和遠程? 。
你為什么期望它們是一樣的? (這是一個真正的問題;我可以想出一些理由來預期。顯然它們不一樣,所以這些理由一定是錯的。你可能會想出一套不同的“可能的理由來期待它們但是,“我會這樣做,所以這是一個有用的練習,讓你思考為什么你期望它們是相同的。”
在任何情況下,git並不真正關心任何其他存儲庫(在同一台計算機或不同的計算機上)中的內容。 它一次只能在一個存儲庫上運行,並且只關心該存儲庫中的內容。
這里還要注意git pull
是一個執行兩件事的腳本:首先,它運行git fetch
,這是與其他git(通常但不一定在某些其他計算機上)聯系的實際命令,以找出“他們有什么,你沒有“。 然后,在完成之后,如果需要, git pull
運行git merge
或git rebase
1 。
“其他git”被稱為“遠程”,對於典型的克隆,只有一個遠程origin
。
git push
命令還與(或)“遠程”對話 - 它通常(但不一定)在不同的計算機上 - 並且要求遠程(另一個git存儲庫)更新它(遠程的)當地分公司。
我們現在需要一點背景信息。 你自己的git嘗試使用“遠程跟蹤”分支跟蹤“遙控器上有什么”。 這些分支顯示為origin/ whatever
。 同樣,這與遠程控制的位置無關:遠程分支標簽的這些副本僅存儲在本地。
當你執行git push --delete v0
你讓你的git調用另一個git並要求它(另一個git)刪除它的v0
。 它確實刪除了它之前的(本地) v0
分支 - 然后你的git刪除了你的本地副本,你的git稱為origin/v0
。
當你以后改為另一個克隆時,你運行了git pull
,它運行了git fetch
。 這個git fetch
調用了另一個git(通常是在另一台計算機上,但在這種情況下實際上是在同一台筆記本電腦上)。 我將在這里略過一些細節(細節取決於特定的git版本:git 1.8.4左右有一個相當大的變化)並假裝你運行git fetch
(這避免了需要關心這些細節,這實際上並不影響最終結果)。
這一次,你的git fetch
調用遠程git並詢問它現在有什么,而遙控器沒有列出v0
,因為它現在已經從遙控器中消失了。 這給你的(本地)git帶來了一些問題。 你的本地git早些時候從那個遠程git獲得了v0
,現在它已經消失了。 你的本地git應該刪除它的origin/v0
,還是應該保留它?
git程序員在這里選擇的答案是你的git應該保持其origin/v0
,以防你使用它的東西。 如果您希望 git fetch
刪除遙控器上現在缺少的v0
本地origin/v0
副本,則應該在git fetch
命令中添加--prune
選項。 2這告訴你當地的git刪除本地origin/ whatever
,只要遙控器上的whatever
已經消失。 否則,你當地的git會保留它。
為什么git push --delete
刪除它,當git fetch
沒有--prune
保留它? 對於編寫git本身的人來說,這是一個問題。 3
1默認情況下,如果您沒有設置任何內容來覆蓋默認值,則運行git merge
。 由於git rebase
可能是一個更好的默認情況下,有很多的方式,使pull
使用rebase
。
2您也可以使用git remote prune origin
或git remote update origin --prune
。 有一些小的git錯誤使每個人的行為略有不同。 據我所知,他們都固定在git版本2.0或更高版本。
3我猜 , 4當然:似乎如果你,運行git push
的用戶,你說要從遠程刪除分支,你可能不會特別想保留你的分支的本地副本一旦你已經成功刪除了他們的分支。 但這只是猜測。
4 我也可以從邪惡的深處召喚靈魂 ,但他們從未出現過。 :-)
根據您的配置, git pull可能只會拉動您所在的分支。 嘗試git fetch,然后git branch -r。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.