【问题标题】:Merge fast-fowards to another branch and no commit record is created合并快进到另一个分支并且不创建提交记录
【发布时间】:2013-06-15 05:39:15
【问题描述】:

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

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

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

【问题讨论】:

  • 当你说cmets失踪的时候,你查过历史吗?你所做的任何事情几乎肯定会在某个地方出现。启动gitk --all 并检查提交内容。

标签: git git-branch git-merge


【解决方案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 没有任何问题。

This answer 有更多详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 2016-03-23
    • 1970-01-01
    • 2018-03-12
    • 2019-05-20
    • 1970-01-01
    • 2011-08-19
    相关资源
    最近更新 更多