2017-07-18 36 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你说得对,我的解释过于简单。我的观点是,提交取决于它的父项,所以你不能将完全相同的提交移动到具有不同的父项,因为它的哈希将会改变。我编辑了答案来澄清。 –

相关问题