2013-05-07 129 views
7

我在Github上有一個倉庫,有2個分支:masterdevelopgit clone如何實際工作

當我克隆存儲庫並運行$ git branch時,它只顯示master分支。
如果我運行$ git branch -a我可以看到所有的遠程分支。

現在,如果我做了$ git checkout develop,我得到的消息:

科發展成立跟蹤遠程分支從起源發展。
切換到新分支'develop'

究竟發生了什麼?當我運行$ git clone remote-url時,或者當我運行時:$ git checkout develop或兩者都沒有提交來自遠程develop分支的提交?

我在簽出develop後做了$ git pull origin develop,還是已經完成了?

請幫我理解clone在遠程有多個分支時的工作原理。

回答

9

git clone提取所有遠程分支,但只爲您創建一個本地分支master。所以,當你運行git branch -a,你會看到這樣的事情:

$ git branch -a 
* master 
    remotes/origin/HEAD 
    remotes/origin/develop 
    remotes/origin/master 

,這意味着你有一個地方分支master和幾個遠程分支機構。當您運行git checkout develop時,git會創建另一個本地分支developtrack遠程分支origin/developgit嘗試同步跟蹤分支,因此您不必在check out之後再執行另一個pull

如果本地和遠程分支術語聽起來令您感到困惑,您可以瀏覽this document。它有一些很好的數字來幫助你理解它們,以及當你進一步提交時本地和遠程分支機構如何移動。

你可能會覺得這個答案有幫助:How to clone all remote branches in Git?,第一個答案。

+0

謝謝你們,你們每個人。現在我懂了。因爲它有最完整的解釋,我接受這個答案。 – 2013-05-07 20:35:20

+0

謝謝,這很有用。一個小問題,你說「git試圖同步跟蹤分支,所以你不必在退房後再做一次拉動」,這似乎暗示了結賬會同步遠程跟蹤分支作爲過程的一部分。情況並非如此,只有一個'git fetch'會從遠程(或者'git pull')中檢索更新,它使用fetch作爲過程的第一部分)。結帳只需使用遠程分支的現有本地副本。遠程追蹤僅將本地分支鏈接到遙控器,以便在拉動時簡化命令,但不會添加任何同步。 – SuperDuperApps 2016-12-26 01:19:24

1

當您克隆存儲庫時,您將獲得可以從任何這些分支到達的所有分支和所有提交。

然而,您不會獲得除主人以外的任何其他分支的本地分支。其他人在那裏作爲遠程分支(遙控/起源/發展),你可以檢查出任何你想要的。然後,git會在遠程分支和您在簽出時創建的本地分支之間建立跟蹤。

6

git clone首先創建一個新的空存儲庫。 (如git init

然後它將給定的存儲庫設置爲名爲「origin」的遠程設備。(git remote add

然後通過git fetch完成主要工作,這是與其他存儲庫交談的唯一命令。它將遠程存儲庫的所有提交轉移到當前存儲庫,並在遠程存儲庫上的分支所對應的「remote/origin /」開始的本地存儲庫分支內創建。

如果您有一個默認的非裸倉庫,它也會調用git checkout來檢出通常的主分支。

如果您打電話給git branch -r,它會顯示「遠程」分支,即存儲庫中的那些分支,該分支將由git fetch更新。 (你從來沒有直接對這些工作。)

無論何時你想在一個分支上工作,你會使用git checkout這將創建該分支的副本,沒有「遠程/源/」前綴。那些是你工作的「當地」分支。 (git branch將顯示那些。)

幾乎所有你做的只涉及你的本地存儲庫。唯一的例外是git push,這是唯一更新遠程存儲庫的命令,而git fetch是查詢其他存儲庫的唯一命令。

git pull只是git fetchgit merge的組合。第一個獲取更改並更新remote/origin/*,第二個將這些更改合併到本地分支中。

0

簡單地說,混帳克隆庫,URL做以下的事情,依次是:

  1. 創建一個新的空庫。 (git init
  2. 將給定的存儲庫設置爲名爲「origin」的遠程設備。 (git remote add origin repository-url
  3. 從遠程調用「origin」獲取所有提交和遠程分支。 (GIT中取--all
  4. 創建本地分支主跟蹤遠程分支來源/主(GIT中結帳--track原點/主

一個有趣的一點是一個分支(在github或bitbucket中)只是一個服務器端的克隆。