当我从另一个分支合并到当前工作区时,使用git merge
命令时,Git有时会创建一个新的提交:
Merge remote-tracking branch xxx into xxx
有时候,它并不会:Fast-forward
... src files ...
那么是什么决定了是否应该创建提交?
当我从另一个分支合并到当前工作区时,使用git merge
命令时,Git有时会创建一个新的提交:
Merge remote-tracking branch xxx into xxx
有时候,它并不会:Fast-forward
... src files ...
那么是什么决定了是否应该创建提交?
所谓的“快进合并”不会产生提交,而其他合并(通常称为“章鱼合并”(现在你知道为什么Github的吉祥物是章鱼猫了吧))则会产生提交。
基本上,“快进合并”发生在您的分支没有分叉的情况下。
假设您想要将一个名为foo
的分支合并到master
分支中。如果这些分支没有分叉,那么您将拥有以下历史记录(每个*
代表一个提交):
*---* (master)
\
*---*---* (foo)
在这种情况下,合并是< strong> 快进(fast-forward)的,因为(根据图形理论,这是git图形的基础),< code> master 可以从< code> foo 到达。换句话说,您只需将< code> master 引用移动到< code> foo ,就完成了:
*---*
\
*---*---* (master, foo)
当你的分支开始分叉:
*---*---* (master)
\
*---*---* (foo)
你需要创建一个提交来“合并”这两个分支:
↓
*---*---*-------* (master)
\ /
*---*---* (foo)
箭头指向的提交是合并提交,并具有两个父提交(以前的master
分支尖端和当前的foo
分支尖端)。
请注意,您可以使用--no-ff
选项强制Git为快进合并创建合并提交。
我强烈推荐阅读http://think-like-a-git.net/,以更好地理解图论如何应用于Git(您不需要了解图论,网站上所需的一切都在网站上),这将使使用Git变得非常容易 :)
--no-ff
选项来强制创建一个新的提交,以避免快进。当没有传入 --no-ff
参数时,如果你要合并的分支的头部是已合并分支的祖先,git 就不会创建新的提交记录。在这种情况下(没有 --no-ff
参数),它只是移动 HEAD 指针(也就是所谓的快进操作)。
来自文档的摘录:
通常当前分支头是指定提交的祖先。这是最常见的情况,特别是在从git pull调用时:您正在跟踪一个上游存储库,没有提交本地更改,现在您想要更新到较新的上游修订版。在这种情况下,不需要创建新的提交来存储组合历史记录;相反,将HEAD(以及索引)更新为指向指定的提交,而不创建额外的合并提交。
可以使用--no-ff选项抑制此行为。