2014-01-17 97 views
1

我對git合併感到困惑。與git中的主合併後,功能分支會發生什麼變化

想我已經從master採取feature分支,他們已經divergedliek這 和他們合併這樣

enter image description here

現在我想知道,這將是該圖此命令後

git checkout master 
git merge new-feature 
  1. 此命令後的圖表是什麼

    git checkout master git merge new-feature

    後提供我不關閉功能分支後,只是做一提交之後的特性分支

回答

7

答案是:什麼也沒發生的feature分支爲合併的結果。新的合併提交被添加到當前分支(合併完成時爲master)。沒有現有的提交會受到影響,因爲根本不能改變現有的提交。

另外,提交之間的箭頭確實應該指向另一個方向。新的提交指向較舊的提交;較舊的提交不能被修改,而不是最小的提交,所以沒有辦法「向一個較舊的提交添加一個箭頭」。您只能對一個或多個較舊的提交進行新的提交,該提交具有一個或多個後向箭頭。 (每指向一次提交一個箭頭,也就是說,你甚至可以用一個新的提交來提交沒有指向箭頭:這是一個新的「根提交」,雖然這是一個更高級的事情, 。不是所有的共同在庫)

儘管ASCII技術版本不一樣漂亮,這些是相同的前和圖表後:

 o-o  <-- feature 
    /
o--o--o--o  <-- master 

[變爲:]

 o-o  <-- feature 
    / \ 
o--o--o--o--o <-- master 

如果您然後檢查出feature並添加一個其他承諾feature在此之後,就變成:

 o-o--o <-- feature 
    / \ 
o--o--o--o--o <-- master 

編輯:讓我們重新繪製最後一張圖片(圖片一樣,我們只是把一個名字m1,對於「合併#1」,在地方o S的一個代表提交):

 o-o--o <-- feature 
    / \ 
o--o--o--o--m1 <-- master 

現在假設你繼續發展走在feature,增加兩次提交:

 o-o--o--o-o <-- feature 
    / \ 
o--o--o--o--m1   <-- master 

然後決定再次合併featuremaster。要做到這一點,git會需要作出一個新的合併提交,m2

 o-o--o--o-o <-- feature 
    / \  \ 
o--o--o--o--m1------m2 <-- master 

合併的合併基礎是通過看合併得到的,這樣的git可以告訴大家,只三個最新feature提交需要被帶到。

這就是爲什麼,如果你決定從feature東西打破master,你將合併m2之前「撤消」,你需要手動「重做」,如果需要。也就是說,假設使合併m1後,但增加對feature三個新提交之前,你會發現master被打破,您添加提交f(「通過去除一塊功能的修復」):

 o-o   <-- feature 
    / \ 
o--o--o--o--m1--f <-- master 

現在,你像以前一樣繼續前進,工作feature,添加三個提交:

 o-o------o-o-o <-- feature 
    / \ 
o--o--o--o--m1--f   <-- master 

現在,當你去git merge featuremaster,git會再次找到了基地,才知道採取從三個最新的變化提交併添加它們到f

 o-o------o-o-o <-- feature 
    / \   \ 
o--o--o--o--m1--f------m2 <-- master 

但提交f的新功能禁用故意一部分。您可能必須手動修復合併(在提交m2之前或在m2之後的單獨提交中 - 如何執行此操作取決於您),即「撤消」f中的修復,重新啓用完整功能。


不管是否以及何時feature要稍後再合併到master,您可以選擇是否要合併到masterfeature。讓我們假設例如有什麼東西在master特別G洪水是應該納入feature

 o-o  <-- feature 
    / \ 
o--o--o--G--m1  <-- master 

在這裏你可以:

git checkout feature && git merge --no-ff master 

帶來的G的變化,m1feature 。當然,在m1的變化已經出現,但混帳可以算出來本身,所以它真的只在好東西從G帶來:

 o-o----m2 <-- feature 
    / \/
o--o--o--G--m1  <-- master 

--no-ff如果你想要一個明確的合併提交時,才需要這對於使「功能」的開發線脫穎而出非常有用。如果你離開了--no-ff,git會看到,把m1feature的結果,那麼,m1,並且將只是移動分支標籤,在「快進」操作:

 o-o 
    / \ 
o--o--o--G--m1  <-- feature, master 

如果你是「分支功能」(git checkout feature),並作出新的承諾,這將離開標籤masterm1指指點點,feature你的指點‘新最新的’承諾:

 o-o 
    / \ 
o--o--o--G--m1  <-- master 
       \ 
       o <-- feature 

我把feature向下跌破至emphas請注意,「頂部」o-o行有一次出現在feature上並不明顯。

注意,此圖是一樣的這種替代繪圖看起來有點像蝸牛:

 o-o o <-- feature 
    / \/
o--o--o--G--m1  <-- master 

其中的一種暗示,該o-o威力已經對功能的;但是從這個繪圖,其中包括m2很大的不同:

 o-o----m2--o <-- feature 
    / \/
o--o--o--G--m1  <-- master 

和這使得它非常清楚,feature有一個完整的血統可以追溯到早期的頂部o-o。這基本上是「與--no-ff合併的其他方向」。

(你要嗎?嗯,這取決於,真的。像「蝸牛」一圖是很常見的,你習慣了它們,知道哪個分支標籤是一些犯序列一些在過去的時間往往不是很有用,但有時它是有用的,然後你想看起來更像帳篷和幾何事物,而不是蝸牛的圖形。:-))

+0

謝謝,這是我誤解了,我認爲當我合併然後功能分支也得到主人的承諾,所以這意味着如果我必須繼續功能,那麼我必須合併主功能分支也? – user3147180

+0

除非你想從'master'中選擇新的東西,否則你不能*將*''合併回''feature'。如果您只是繼續在'feature'上開發,然後再次將'feature'重新合併到'master'中,則「merge base」是合併到master中的最後一個點。我會添加一些圖表。 – torek

+0

其實'功能'是我的本地分支,我做所有的東西,然後我從主人拉最新的東西,然後首先合併我的東西與主人,並推動主服務器,然後我也想有主人的東西,所以我需要合併掌握'特徵'分支。有沒有更好的方法呢? – user3147180

相關問題