我想保留开发中的提交历史记录,但只保留 main 中的合并提交。我认为挤压合并可以做到这一点,但显然它会产生这里描述的问题:挤压合并后,提交历史记录仍然显示在合并请求中作为分支之间的差异,即使它们在那时应该是相同的。
还有其他方法可以实现此目的吗?也许我不需要在开发中保留提交,但我希望能够在我们公司的 bitbucket 帐户上浏览它们。
这听起来像是对什么是合并、什么是分支以及什么是 Git 的误解。
只是快速总结一下:
Git 是一个由提交组成的非循环有向图,每个提交(创建的第一个提交除外)至少有一个父提交。“历史记录”是通过从任何给定的提交向后跟踪父链来简单地生成的。
分支只是一次提交的名称。
与通过编辑-添加-提交周期进行的普通提交不同,合并提交完全由 Git 本身创建。根据定义,它至少有两个父母;通常(尽管不一定),在合并之前,这些是您所说的“所在”分支,git merge并且是该命令的“直接对象”分支git merge <otherbranch>。
接着。您希望“能够回浏览”合并到 main 中的提交是绝对正确的,即维护以存储库拓扑表示的真实历史记录。只有合并提交才能做到这一点。
考虑到这种愿望,并假设这就是您想要做的,那么说“在开发中保留提交历史记录,而仅保留合并提交”是毫无意义且无用的。根据分支的定义,只有一次提交main。您错误地认为“在 main 中”的其他提交是通过主提交的父链以及任何这些提交的任何父级可到达的所有提交的总和。正如我一开始就规定的那样,历史就是这样。
(换句话说 - 更令人惊讶的是,也许,因此可能更有帮助 -每个分支“包含”整个历史记录,一直追溯到此存储库中所做的第一次提交。)
因此,如果没有创建合并提交时合并的两个分支的历史记录中的所有提交,就不可能在“主”(或任何分支)中拥有真正的合并提交。
所以不用担心,开心就好。您始终可以遍历历史记录,同时忽略所有合并的第二个父级,在这种情况下,您将获得您正在寻找的单个合并提交链,例如
git log --graph --decorate --oneline --first-parent
Run Code Online (Sandbox Code Playgroud)
该命令将为您提供您正在寻找的 main 视图。但这并不是因为这就是主要内容,而是因为这是你选择查看历史的方式。