为什么git merge有时会创建一个提交,有时候不会?

时间:2013-11-26 16:35:55

标签: git

当我从另一个分支到当前工作空间git merge时,git有时会进行新的提交:

Merge remote-tracking branch xxx into xxx

有时,它没有:

Fast-forward
... src files ...

那么是什么决定了是否应该创建提交?

4 个答案:

答案 0 :(得分:50)

所谓的“快进”合并不会产生提交,而其他合并(通常称为“章鱼合并”(现在你知道为什么github的mascott是octocat))会产生提交。

基本上,当你的分支没有分歧时,会发生快进。

假设您要在foo分支中合并分支master。如果这些分支没有分歧,你会有这样的历史记录(每个*代表一个提交):

*---* (master)
     \
      *---*---* (foo)

在这种情况下,合并是快进因为(根据图论,这是git图的基础),master可以从{{1}到达}}。换句话说,您只需将foo引用移至master,即可完成:

foo

当你的分支分歧时:

*---*
     \
      *---*---* (master, foo)

您必须创建一个“加入”两个分支的提交:

*---*---* (master)
     \
      *---*---* (foo)

箭头指向的提交是合并提交,有两个父提交(前 ↓ *---*---*-------* (master) \ / *---*---* (foo) 分支提示和当前master分支提示)。

请注意,您可以强制Git为foo选项的快进合并创建合并提交。

我强烈建议您阅读http://think-like-a-git.net/,以便更好地理解图论如何应用于git(您不需要了解图论,您需要知道的一切都在网站上),这将使与Git合作非常容易:)

答案 1 :(得分:5)

您可以使用--no-ff选项强制新提交以避免快进。

答案 2 :(得分:2)

快进意味着提交已经发生并存储在您的日志中,并且您的HEAD(指针)已向前移动到该提交。您可以查看合并行为here

答案 3 :(得分:1)

如果没有提供快进--no-ff选项,如果要合并的分支的头部是合并分支的祖先,git将不会创建提交。在这种情况下(没有--no-ff选项)它只会移动头部(它是快进的)。