合并后的 Git 分支和提交历史记录

Posted

技术标签:

【中文标题】合并后的 Git 分支和提交历史记录【英文标题】:Git branches & commits history after merge 【发布时间】:2011-11-08 15:36:32 【问题描述】:

我正在开发一个项目(单独),对于我开发的每个功能,我都会创建一个新分支,处理此功能,然后将其合并到 master。所以通常我从不同时在两个不同的分支上工作,并且在一个分支上工作时从不碰master。

当我合并一个分支时,我看到(使用gitxgitk)主分支的历史记录获得了我对合并分支所做的所有提交。我的意思是,如果我有类似的东西:

master a-b-c-d
              \z-x-y--
              |branch name

合并后我得到:

a-b-c-d-z-x-y
            |branch name

是的,我看到合并的分支名称突出显示(使用 gitxgitk),但我期待的是准确显示提交完成的位置(到哪个分支),例如:

master a-b-c-d--------M--
              \-z-x-y-/
              |branch name

所以我希望看到一个提交“M”,它代表我对 master 所做的合并,而不是看起来我对新分支所做的所有提交都已完成 master。

我的预期正确吗?或者这是正常的git 行为?

【问题讨论】:

【参考方案1】:

这是正常的 Git 行为。您正在执行所谓的“快进”合并,因为您的分支严格位于 master 分支之前。

如果您真的想保留分支历史记录(尽管我建议您不要打扰),那么您可以使用 git merge --no-ff 强制它创建合并提交,即使它可以进行快进更新。

【讨论】:

在合并功能分支时使用--no-ff 有一些好处。主要的一点是,它是一次性还原以支持该功能。 非常感谢您提供这些有用的信息。 @Cameron 你能解释一下为什么不建议这样做吗?我可以“保留”我所有的旧合并吗? (这基本上是因为我需要写一份关于我的项目的报告,所以我的分支截图会有所帮助) @Ans:我不推荐它只是因为我从来没有发现它的用途。我更喜欢让master 历史尽可能简单和线性,一旦功能分支被合并,我就不需要关心它。@Dan Ray 关于一次性恢复的观点是有效的,所以这可能是使用no-ff 的一个很好的理由。您可能无法轻松地重新生成您的分支历史记录,但如果您仍然拥有所有旧分支,那么您可以手动生成一个分支,该分支按照您将它们合并到 master 的相同顺序合并所有功能。跨度> 【参考方案2】:

您可以在“Understanding the Git Workflow”中找到对 -no-ff 选项的其他批评,主要是因为它会破坏 git blame。 更多信息请访问“fast forward when using pull and no-ff when pull”。

如“Why does git use fast-forward merging by default?”中所述,除非您谈论的是一个非常长寿的分支,否则fast-forward merge 是更可取的。

【讨论】:

以上是关于合并后的 Git 分支和提交历史记录的主要内容,如果未能解决你的问题,请参考以下文章

将 git repo 分支(具有不同的历史记录)合并到主分支 [重复]

git删除所有提交历史记录

删除 git 历史记录中包含合并的特定提交

如何在 git 分支中获取给定作者的提交消息历史记录? [复制]

git:清理 git 历史记录并仅在 master 中保留合并的提交

在 GitHub 上维护线性历史记录,同时拥有 2 个永久分支