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

46 git

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

Merge remote-tracking branch xxx into xxx
Run Code Online (Sandbox Code Playgroud)

有时,它不会:

Fast-forward
... src files ...
Run Code Online (Sandbox Code Playgroud)

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

Geo*_*let 63

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

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

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

*---* (master)
     \
      *---*---* (foo)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,合并是快进的,因为(根据图论,这是git图的基础),master可以从中获得foo.换句话说,你只需要将master引用移动到foo,你就完成了:

*---*
     \
      *---*---* (master, foo)
Run Code Online (Sandbox Code Playgroud)

当你的分支分歧时:

*---*---* (master)
     \
      *---*---* (foo)
Run Code Online (Sandbox Code Playgroud)

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

                ?
*---*---*-------* (master)
     \         / 
      *---*---* (foo)
Run Code Online (Sandbox Code Playgroud)

箭头指向的提交是合并提交,并且有两个父提交(前一个master分支提示和当前foo分支提示).

请注意,您可以强制Git为该--no-ff选项的快进合并创建合并提交.

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


小智 10

您可以使用该--no-ff选项强制执行新提交以避免快进.

  • 谢谢,但我的问题是为什么 git 认为进行合并提交更合适,而不是简单地快速转发工作区? (2认同)