1

我有一个分支和调试分支。他们是一个承诺。debug分支是从master分支的,并且有一个提交。当我合并它们时,git fast-fowards master分支到调试分支,而不是像我熟悉的那样创建另一个提交。它从主分支(合并后变为 HEAD^)中缺少一些信息,即注释。我有几个问题:

为什么它没有创建另一个带有表示分支已合并的注释的提交?
快进的标准是什么?
我是否应该对快进合并感到偏执并每次都检查它?
我认为我的.gitconfig文件中没有任何可能影响行为的内容:

[merge]
    tool = fugitive
[push]
    default = upstream
[diff]
    tool = vimdiff
[mergetool "fugitive"]
    cmd = vim -f -c \"Gdiff\" \"$MERGED\"
[difftool]
    prompt = false
4

1 回答 1

1

当您要合并的提交指向当前提交作为父提交时,Git 默认会进行快进合并(Git 提交(几乎)总是包含指向其父提交的指针,即前驱)。

在这里,提交 A 在开发上,B 在主控上

C      <---       B      <---   A
older stuff       master        develop

快进合并 ( git checkout master; git merge develop) 后:

C      <---       B      <---   A
older stuff                     develop
                                master

在这种情况下,不会有冲突。

将此与更复杂的合并进行比较

C - B'
  \ 
    A'

这里 B' 和 A' 可以在相同的地方引入更改,因此可能会发生冲突,必须能够在合并提交中解决 M

C - B'-M
  \   /
    A' 

如果您不想要默认的快进合并行为,您可以使用 --no-ff 开关。git merge --no-ff develop在上面的第一个例子中会产生。

C - B  -  M (master)
     \   /
       A
       develop

M 是强制的合并提交。Master在M,develop在B。

人们实际上倾向于对不快进的合并更加偏执因为它们有可能产生错误的冲突。如果您希望确保合并仅在快进的情况下继续进行,您可以这样做git merge --ff-only develop

因此,您看到的 Git 行为是标准的,您的.gitconfig.

这个答案有更多细节。

于 2013-06-15T07:41:03.530 回答