2017-07-18 63 views
1

我正在使用兩個分支,masternewFeature。在構建「新功能」時,我向newFeature分支添加了多個提交。我對git merge的理解是,一旦合併了分支,它將在master上創建一個單個提交,但是當合並時,master現在具有在newFeature上的完整提交歷史。對於示例 -爲什麼Git合併在主分支上創建多個提交?

master (pre-merge): 

    1=>2=>3 

newVersion: 

    1=>2=>3=>4=>5=>6 

master (actual results of merge): 

    1=>2=>3=>4=>5=>6 

master (expected results of merge): 

    1=>2=>3=>6 

有什麼辦法去除中介在合併過程中從newVersion承諾,並如預期爲什麼不合並工作?

+1

'git merge'創建一個新的提交,如果需要的話,但**它不會刪除任何現有的提交**。在你的情況下,它沒有創建任何新的提交。它只是移動'master'分支來指向'newVersion'分支已經指向的提交。發生這種情況是因爲兩個分支實際上並沒有發生分歧,並且沒有必要進行新的提交。 – axiac

+0

您可以將您的newVersion分支重新綁定到一個提交中。 – Tom

回答

5

這裏要說明的關鍵是,在整個newVersion的工作過程中都沒有對master進行更改。在這種情況下,Git默認採用「快進」合併,基本上可以認爲這是從newVersion開始的所有新提交,並將它們追加到master上的最新提交中(它不會將提交歷史記錄分開在newVersion上完成)。在

git merge newVersion --no-ff 

結果:這可以通過--no-ff標誌覆蓋,例如

master (pre-merge): 

    1=>2=>3 

newVersion: 

    1=>2=>3=>4=>5=>6 

master (actual results of merge): 

    1=>2=>3=========>7 
      4=>5=>6 

需要注意的是,犯下7 代表合併,並且不取代提交歷史。

參考:https://sandofsky.com/images/fast_forward.pdf

另外,如果您希望鞏固整個提交的newVersion歷史進入一個提交上master(可能是有用的,如果他們是在整個的「新版本」進展只是次要提交)你可以運行與--squash標誌的合併。例如:

git merge --squash newVersion 

結果:

master (pre-merge): 

    1=>2=>3 

newVersion: 

    1=>2=>3=>4=>5=>6 

master (actual results of merge): 

    1=>2=>3=>7 

需要注意的是,7整合的承諾是在做歷史承諾4 - 6

+0

相反:1 => 2 => 3 => 7(並且7有兩個父母:3和6) – eftshift0

+2

這不是'--no-ff'所做的。 '--no-ff'的歷史記錄看起來像是1 => 2 => 3 => 4 => 5 => 6 => 7',其中'7'是合併提交。所有快進合併都會避免創建合併提交。 –

+0

@MichaelMior我會告訴你一個截圖,如果可以的話,但基於'log'我看到的歷史,現在一切都看起來不錯。 @Edmundo是正確的,但它實際上是一個新的提交(即7而不是6) – iliketocode

0

這是不可能有一個最終的歷史,看起來就像你想要的一樣。 git中的每個提交都與其父代綁定。每個提交包含了其父的引用,所以6明確引用5.

如果你確實想成爲的1=>2=>3頂部增加只有 5和6之間的變化,那麼你可以使用git cherry-pick newFeature。這將創建一個新提交其剛剛5和6之間的變化,但對3

上賦予如果你想所有的4,5,6,但你只想要一個單一提交的變化,那麼你可以使用--squash標誌git merge。這將創建一個單獨的新的提交,其中包含來自4,5和6的所有更改。但是,您的歷史記錄不會是1=>2=>3=>6,而是1=>2=>3=>7,其中7是此新提交。

請注意,如果您選擇--squash選項,則只能爲每個分支執行一次一次,因爲通過壓扁,您將丟失關於兩個分支之間有什麼不同的信息。

+0

我可能仍然需要看看它,你的答案.. https://sandofsky.com/images/fast_forward.pdf – iliketocode

+0

「6只包含從5到更改6.「這是不正確的。在git中提交不會記錄更改。每個提交都完全獨立。創建他想要的歷史是完全可能的(當然,如果用提交的內容標識他的號碼1,2,3)。 – AnoE

+0

@AnoE你說得對,我的解釋過於簡單。我的觀點是,提交取決於它的父項,所以你不能將完全相同的提交移動到具有不同的父項,因爲它的哈希將會改變。我編輯了答案來澄清。 –

相關問題