2011-11-12 99 views
4

我想了解/可視化分叉回來的元素。我的起始參考是help pageGit:叉/遠程/克隆概念

第一問題

當我分叉回購例如GitHub上的勺子(即點擊他們網站上的Fork按鈕),這是否意味着勺子被複制到我的GitHub帳戶?真正的複製是真的發生還是僅僅是一個概念?

第二個問題

在幫助頁面的下一步是做克隆

$ git的克隆[email protected]:用戶名/勺Knife.git

該命令在我的本地計算機中創建了一個源代碼的副本。它是否從我的GitHub帳戶中的分叉/複製回購庫中克隆(請參閱我的第一個問題)?或者,從原來的勺子刀回購?

3提問

步驟有關配置的遙控器:

當回購被克隆,它具有遠程叫origin默認指向你的叉GitHub上,而不是原來的回購它被分離出來。要跟蹤原始回購,您需要添加另一個名爲upstream的遠程設備。

因此,是origin我的本地副本和我的GitHub帳戶上的回購副本之間的某種「代理」?而且,upstream怎麼樣?

非常感謝您的幫助。

回答

4
  1. 當你「fork」是要有效地在他們的git存儲庫上創建一個可以簽入的分支時,你所做的一切。

  2. 您克隆到的本地副本只是從您在git-hub上創建的分支中克隆並鏈接到該分支。記住一個分支只是一個指向一個提交對象的指針,所以當你「分叉」時,你只需在它們的repo上添加一個分支名稱,指向它的主目前的頭部。

  3. git中的遠程只是存儲在外部地址的存儲庫的名稱。你的默認「原點」是由git設置的,並且只是一個命名的遠程。 「上游」只是另一個名稱,並指向最初分支的原始主人,以便您可以在主人和自己的分支之間進行更改。你可以用git remote -v看到你的遙控器,並輕鬆添加它們來跟蹤任何外部可用git回購的任何分支。

+0

#1和#2的精彩解說。謝謝!那麼,我分叉後自動創建了「origin」呢? – moey

+0

當我從原版/主版中引入新更改時,是將它們拉到「原點」還是直接拖到我的本地副本? – moey

+1

'origin'是在克隆時創建的。遠程只不過是一個名字和一個指針,例如如果您嘗試以下操作:'git init --bare Base; git clone Base dev1; cd dev1; git remote',你會得到'origin'作爲名字,並且指向dev1指向的Base repo的路徑,在git-hub的情況下,它將是一個ssh引用,在我的例子中是一個簡單的路徑,但是兩者都是告訴Git從哪裏獲取信息。遙控器只是跟蹤其他人的儲存庫,而'origin'只不過是git在使用'git clone'時使用的默認名稱。 –

1

當我把一個repo分叉時,例如勺子在GitHub上,這是否意味着勺子刀被複制到我的GitHub帳戶?

是的。

確實發生了真正的複製,還是隻是一個概念?

這是關於Github的一個實現細節。對你無關緊要。 (我非常確定他們共享存儲空間)。

它從我的GitHub帳戶中的分叉/複製回購克隆了嗎?或者,從原來的勺子刀回購

既然你指出它在你的用戶帳戶的回購,它會從那裏複製它。雖然這兩個叉的內容在這一點上是相同的。

那麼,是源於我的本地副本和我的GitHub帳戶上的回購副本之間的某種「代理」?而且,上游呢?

不是。 「origin」只是GitHub上回購標識符,使您更容易與之通信。 「上游」將工作相同。您不需要設置這些遙控器,而是讓它們適合您經常使用的所有回購(推送或拉出更改),使您更容易。名稱「起源」和「上游」也是公約(你應該遵循),對他們來說沒有「魔力」。

+0

謝謝,Thilo。關於你最後的回答,我們可以將它指向原始回購?如果是,那麼這聽起來像我們並不需要做一個分叉。 – moey

+1

您只需要一個分支就可以進行更改。你不需要在Github上有這個分支(你可以只在本地或在其他服務上),但Github非常方便,特別是因爲你可以使用所有漂亮的網頁和社交功能來推送和評論變更。 – Thilo

+1

啊......現在它更有意義:只有在需要進行更改時才分叉。我認爲,因爲很多人/網站都說「在GitHub上把我叉起來」,它讓我失明瞭,儘管有時候我想要的只是獲得源代碼。 (: – moey

2

第一個問題:

您已將其複製。實際上它是一種克隆。您現在有一個該項目的副本(實際上是其分支之一)在您的github帳戶中。

第二個問題:

git clone命令克隆你給它的回購。 所以$ git clone [email protected]:username/Spoon-Knife.git克隆勺子刀從username回購。如果是自己的帳戶,這是你的勺子,刀回購:)

第三屆問題副本的副本:

origin不是一個代理,它只是一個名字到另一回購。 例如下面的命令添加名爲local_srv回購:

git remote add local_srv /path/to/local/srv 

upstream只是另一個遠程。您可以將其配置爲從中獲取(即獲取更新)。

您的情況origin是您的github回購(我稱之爲遠程github),您可以將upstream遠程添加到原來的勺子刀庫中。 因此,您在本地項目中工作,推送到您的github帳戶(例如git push origin master),並使用git pull upstream master獲取勺子刀項目的新更新。

注意:這裏我只用了master,但是你可以用你喜歡的分支替換它。

+0

謝謝,@Geoffroy!當我第一次分叉項目時,是'origin'自動創建的?還是它是克隆命令的副產品? – moey

+0

是的。您可以使用'git remote'來查看當前的遙控器列表:) – Geoffroy

4

你需要克隆的概念區別開來。

  • 克隆是GitHub上之前存在一個Git的概念:當你克隆一個倉庫,你複製它所有的歷史和數據集成到自己新創建的存儲庫。另外,遠程會自動在新存儲庫中創建,稱爲原點,它指向您從中克隆的存儲庫。

  • fork是一個GitHub概念,核心Git不知道。當您分叉GitHub項目時,您正在創建與原始GitHub項目相同的GitHub項目,所有GitHub功能(如叉形圖)都會自動更新。在幕後,fork還包括克隆原始項目中的Git存儲庫,並在新創建的項目中創建一個新的Git存儲庫。

當你想從自己的私人計算機上GitHub的項目工作,你需要首先克隆了一個倉庫,不管它是你的倉庫或其他人的。如果你從你的 GitHub項目克隆,你會得到它作爲原產地,但如果你想要原始項目作爲一個遠程,你需要手動添加(並稱爲上游,爲例)。

+0

謝謝@Daniel!澄清你的最後一段:如果我從我的GitHub項目中克隆,** origin **指向我的GitHub倉庫,對嗎?這聽起來像一個_remote_是一個指向遠程存儲庫的本地指針。 – moey

+0

當原始項目發生新的更改時,是否需要先在GitHub中更新我的項目,然後再更新到本地副本?或者,我應該/可以直接從原始項目更新到我的機器嗎? – moey

+1

@ Siku-Siku.Com正確,a * remote *是指向另一個存儲庫的本地指針。至於你的第二個問題,你有兩個選擇:更新你的GitHub項目,使用GitHub中的「快進」按鈕(只有當你還沒有提交任何項目時纔可能)。要更新機器上的存儲庫,請將原始項目的存儲庫添加爲遠程(**上游**以上),然後從中取出。然後,如果需要,您也可以推送到您的GitHub項目。 –

1

使用git,每個存儲庫都可以獲得完整的歷史記錄。實際上(除了在本地存儲庫之間共享數據的一些優化之外),每個存儲庫都是另一個存儲庫的克隆。或者在git hub中說一個分支(他們是同一件事)。

因此,您有三個存儲庫:原始開發人員存儲庫,git集線器上的克隆(他們稱之爲分叉)以及本克隆的本地克隆。名稱origin只是一個簡寫名稱,用於指代git hub(您的第一個克隆)上的存儲庫。如果沒有這個簡寫,你將不得不在每一步中將完整的URI提供給存儲庫。

存儲庫可以有許多這樣的簡寫名稱到其他存儲庫。建議他們都克隆相同的原始存儲庫,以便歷史記錄是一個具有單個根的簡單有向無環圖。

你可以在git hub上沒有中間克隆的情況下工作,但由於你沒有對原始開發者存儲庫的寫入權限,並且你可能不可能訪問你的私有存儲庫,所以git集線器上的這個存儲庫可以用作您和原作者之間的補丁的通信網關。

1

3回購

original - {GitHub}/octocat/Spoon-Knife 
forked - {GitHub}/ mine/Spoon-Knife 
local - {local}  /Spoon-Knife 
  1. 當你「叉」,你必須在你讀它/寫訪問意義上的實際拷貝。 然而,它可以被認爲是一種有效的「在原始git存儲庫上創建可以寫入的分支」的方法。

  2. 「fork」操作將original複製到您的GitHub帳戶。您可以直接從local克隆推到forked(不是original)。

  3. 簡而言之,remote是存儲在外部地址的名稱。
    「原點」 - 點forked(「原點」是默認remote名)
    「上游」 - 指向original,這樣就可以獲取更改您的回購

你可以看到你的遙控器與git remote -v,並輕鬆添加它們以追蹤任何外部可用git回購中的任何分支。

部分來自馬克的答案。