2016-10-13 406 views
0

假設我們有一個遠程存儲庫,並且我們在本地克隆它。從原始分支/主分支到本地主分支

我們所以現在檢出master分支,我們有本地master和遠程remotes/origin/master

然後我要創建一個新的話題分公司將被合併到遠程主一次審查:

什麼是從本地master VS的等效遠端分支的利弊(如果有什麼區別)?

做同樣的論點適用於長時間運行分支?

編輯:

我一直在試圖跟蹤origin/master我的地方分支機構,我注意到一個很大的弊端:在TFS它不會讓你創建一個拉請求。如果你想要一個,你需要將你的分支推到原點,這會從主分離,它會跟蹤新的遠程分支,然後創建一個拉請求;我說的有什麼不對嗎?如果不是,那麼這是不從origin/master分支的一個重要原因。

+0

有一個不同之處,下面的大多數答案都忽略了,如果你還爲新分支設置了跟蹤信息:'git pull'和'git push'的行爲。請注意,通常在分支遠程引用時自動設置跟蹤,但不從本地引用設置。 –

+0

@AndréSassi取決於你如何分支那個遠程分支。 – poke

+0

我認爲大多數答案都假設當地主人是最新的。把隨機的東西放在本地的「主」上並忘掉它們很容易。如果您手動創建分支機構可能不是什麼大問題,但如果您要更多地實現自動化(例如,與票務系統集成的腳本),併爲許多用戶提供此自動化功能,則幾乎可以肯定地使用'產地/ master'的。爲什麼還要假設'master'是最新的,並且當你不需要時不會同步呢? – Chris

回答

1

只要本地主分支與遠程分支保持同步,就沒有區別。兩者都將處於提交/時間點,因此從哪一個開始並不重要。

但是,如果您對主分支進行了本地更改,但不保證將其合併到新分支合併到的遠程分支中,則可能需要從遠程引用開始。在這種情況下,兩者之間存在差異,因爲兩個分支包含不同的提交。

一般來說,規則是您從最後想要合併的分支開始分支。如果你跟蹤遠程分支機構,1對1本地和遠程都不會有所作爲。

+0

所以基本上我應該從我不太可能改變的那個分支出來?如果我從本地主服務器分支並對其進行更改,會出現什麼問題?只需要進行更多維護,將新分支中的更改推送到遠程,而不包括主控上的新提交? –

+0

@Uno正如我在答案中所解釋的,新分支與您建立分支的關係不存在關係。當「分支」時,您只需選擇恰好具有臨時名稱(分支)的base * commit *(不是分支)。 – poke

1

假設master是最新的遠程跟蹤分支origin/master,根本沒有實際的差異。

分支只是指向歷史提交的指針,所以當分支一個分支時,你只是創建另一個指向同一個目標的指針。該指針與「原始指針/分支」無關;它只指向一個提交。所以當你繼續在這個新分支上工作時,新的提交將只使用提交的父關係引用基礎。分支本身與歷史完全無關。

Git有一種方法可以爲分支添加某種元數據。然而,標準的分支機制,例如使用git branchgit checkout -b,不會使Git附加任何額外的元數據到分支。

唯一相關的元數據是遠程跟蹤分支。但通常情況下,您不希望有多個分支跟蹤相同的上游分支。

因此,在你的情況下,當你創建一個功能分支或什麼的時候,只需分支masterorigin/master。這並不重要。

+0

如果主控和原點/主控不同步會怎麼樣?它會像從原始/主變更到主,然後合併我的分支一樣? –

+0

如果它們不同步,那麼分支'master'會將新分支放在與'master'相同的提交上,並且分支'origin/master'會將新分支放在那個提交上。它不會影響'master'和'origin/master'。合併時,取決於您合併事物的順序。例如,如果你分支'origin/master',然後做了一些工作,最後把這個新分支合併到'master'中,那麼你也間接地將從origin/master(從那個時間) 'master'的。 – poke

+0

當您間接地從原始/主數據中提取更改時,可能會與我的主題分支更改發生衝突;在這種情況下,這兩種方法會有什麼不同嗎? –

0

我不認爲有任何絕對的優點和缺點。你只是從一個分支或另一個分支開始。本地主人是您PC上的主分支。遠程主機只是遠程PC(服務器等)上的主分支。他們都只是他們所在機器的本地分支機構,他們擁有相同的名稱。

唯一的區別是遠程行爲作爲跨多個用戶的中心。我強調這些行爲是因爲git中沒有任何東西會迫使遠程分支成爲「樞紐」。它恰好被你的團隊用作一箇中心作爲一個慣例。

可能有一些微妙的優點,例如,您可能能夠通過從一個或另一個分支來隱式設置上游分支。或者您不需要擔心您的本地主分支機構不能通過直接從遠程分支機構完全掌握最新的遠程分支機構。

考慮到所有這些,我甚至不知道如何基於遠程分支而不是本地分支來分支分支......但假設它可以完成,上面應該是準確的=)。

+0

如果本地主站不是最新的origin/master並且我從本地分支,那麼哪種情況會導致問題? –

1

運行git fetch將始終帶來origin/master最新,因此在大多數環境中優選origin/master可能是正確的。當使用主題分支進行所有開發時,我發現本地的master令人討厭,因爲我覺得不得不不時更新它,即使它沒用,因此我寧願刪除它。

將本地master作爲開發基礎的一個可能的原因是您確實有更多的控制權。如果有人將錯誤的力量推送到遠程master,當您嘗試將其合併到本地master時,您可能會注意到它,而origin/master只會自動指向新的歷史記錄。或者也許你想要一個穩定的開發基地,同時仍能夠獲取上游的變化?

+0

有一個本地'master'的原因之一是能夠在*主題分支中合併* – poke

+0

喜歡原產地/主人的好的解釋;我不確定我是否理解你的意見,支持本地分支機構,請你澄清一下嗎? (如果有人做錯誤的推力......) –

+0

@poke,你並不真的需要它;只需簽出'origin/master'併合並。你會在一個獨立的頭上工作,但你只是在推送之前創建單一的合併提交 - 不需要命名。這真是一個相同的論點:一個本地的'master'需要更多的努力來確保它是最新的,當合並時(創建分支時經文更加重要)。 – Chris

0

沒有區別,通常如果你想創建一個新的分支,比如Branch1,你將在你的系統中從git服務器本地簽出最新提交的master,簽出master代碼到一個名爲Branch1的新本地分支,並將Branch1提交後的git服務器。這裏的要點是確保你的主代碼是最新的。