[英]How git clone actually works
我在Github上有一個存儲庫,有2個分支: master
和develop
。
當我克隆存儲庫並運行$ git branch
它只顯示master
分支。
如果我運行$ git branch -a
我可以看到所有的遠程分支。
現在,如果我進行$ git checkout develop
,我收到消息:
分支機構開發設置跟蹤遠程分支從原點發展。
切換到新的分支'發展'
究竟發生了什么? 當我運行$ git clone remote-url
,或者當我運行時: $ git checkout develop
,或者兩者都未獲取來自遠程develop
分支的提交?
退房develop
后我有沒有做過$ git pull origin develop
,或者它已經完成了?
請幫助我理解當遠程有多個分支時clone
如何工作。
git clone
獲取所有遠程分支,但只為您創建一個本地分支master
。 所以當你運行git branch -a
,你會看到類似這樣的東西:
$ git branch -a
* master
remotes/origin/HEAD
remotes/origin/develop
remotes/origin/master
這意味着您有一個本地分支master
和幾個遠程分支。 當你運行git checkout develop
,git創建另一個本地分支develop
來跟蹤遠程分支origin/develop
。 git
嘗試同步跟蹤的分支,所以你不必做的另一個pull
后check out
。
如果本地和遠程分支機構的術語聽起來很混亂,您可以瀏覽此文檔 。 它有一些很好的數字可以幫助您理解它們,以及當您進一步提交時本地和遠程分支如何移動。
您可能會發現此答案很有用: 如何在Git中克隆所有遠程分支? ,第一個答案。
git clone
首先創建一個新的空存儲庫。 (比如git init
)
然后,它將給定的存儲庫設置為名為“origin”的遠程存儲庫。 ( git remote add
)
然后主要工作由git fetch
完成,這是與其他存儲庫通信的唯一命令。 它將遠程存儲庫的所有提交傳輸到當前存儲庫,並在本地存儲庫分支內創建,從與遠程存儲庫上的分支對應的“remote / origin /”開始。
如果你有一個默認的非裸存儲庫,它也會調用git checkout
來檢查通常是主分支。
如果你調用git branch -r
它將顯示“遠程”分支,即存儲庫中的那些分支,它將由git fetch
更新。 (你永遠不會直接在這些方面工作。)
每當你想在一個分支上工作時,你都使用git checkout
來創建該分支的副本,而不使用“remote / origin /”前綴。 這些是您工作的“本地”分支機構。 ( git branch
將顯示那些。)
您所做的幾乎所有事情都只涉及您的本地存儲庫。 唯一的例外是git push
,它是更新遠程存儲庫的唯一命令,而git fetch
是查詢其他存儲庫的唯一命令。
git pull
只是git fetch
和git merge
的組合。 第一個提取更改並更新remote / origin / *,第二個將這些更改合並到本地分支中。
簡而言之, git clone repository-url
按順序執行以下操作:
創建一個新的空存儲庫。
git init
創建一個名為“origin”的遠程並將其設置為給定的URL。
git remote add origin repository-url
從遠程稱為“origin”獲取所有提交和遠程分支。
git fetch --all
創建一個本地分支“master”以跟蹤遠程分支“origin / master”。
git checkout --track origin/master
有趣的是,fork(在GitHub或Bitbucket中)只是服務器端克隆。
git clone
默認提取存儲庫的所有分支。 如果要檢出所有分支 ,則需要克隆存儲庫的裸副本,取消設置裸標志並重置它 。 如果您還有其他問題,請與我們聯系。
克隆存儲庫時,您將獲得所有分支以及可以從任何這些分支到達的所有提交。
但是,您將無法獲得除master之外的任何其他分支的本地分支。 其他的那些作為遠程分支(遠程/起源/開發),你可以隨時查看任何這些。 然后,git將在您執行簽出時在遠程分支和您創建的本地分支之間設置跟蹤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.