当我从另一个分支到当前工作空间git merge
时,git有时会进行新的提交:
Merge remote-tracking branch xxx into xxx
有时,它没有:
Fast-forward
... src files ...
那么是什么决定了是否应该创建提交?
答案 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
选项)它只会移动头部(它是快进的)。