Git合并功能分支没有任何提交历史记录

时间:2018-05-11 16:07:07

标签: git merge version-control rebase

说我创建了一个新的功能分支,并对功能分支进行了一系列提交。我的同事也做了一些提交,所以主分支。如何将我的更改合并到主分支,但主分支显示单个提交?我尝试过合并,所有提交都显示出来,它表明我已经分支出来了。我已经尝试过rebasing,它没有显示我的分支,但仍显示我的所有提交。在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

使用git merge --squash(这会强迫您之后也使用git commit

描述

在Git中,提交历史记录。您无法在不添加历史记录的情况下添加提交,因为这些是相同的事情。那么,你想要的是做一个提交一个合并提交,产生的结果就像你做了一个实际的合并提交一样< / em>的

有多种方法可以做到这一点,但最简单的方法是使用git merge --squash。此命令执行我称之为“动词部分”,合并 - 执行合并操作 - 但不是进行合并提交,这是形容词或名词作为典型git merge的一部分,它进行普通的非合并提交。

更确切地说,跳过最终提交,强迫您自己使用git commit进行操作。最后一次提交,你必须自己这样做,是一个普通的非合并提交。如果我们以我喜欢的方式绘制提交,我们从这开始:

...--o--o--o   <-- mainline
      \
       o--o--o   <-- yourbranch

如果使用git checkout mainline; git merge yourbranch进行正常的日常合并,则结果为:

...--o--o--o---M   <-- mainline
      \       /
       o--o--o   <-- yourbranch

这就是你的三个提交现在被添加到主线分支的原因:提交M,新合并,有两个父,其中一个是原始主线另一个是你自己的分支。 (您的三个提交现在都在两个分支上。)

但是,如果我们使用git merge --squash,我们会改为:

...--o--o--o---S   <-- mainline
      \
       o--o--o   <-- yourbranch

与新提交S相关联的内容 与通过提交提交M所获得的内容完全相同,但新提交S只有一个父级,因此它不会将您的三个提交关联到主线分支。您现在可以自由删除您的分支机构。当你这样做时,你的三个提交变得不可能找到,而且相对很快,Git实际上完全删除它们。 1

请注意,您的分支不会自行消失。这里的名称yourbranch使您原来的三个提交保持活着。但是,如果你在你的分支上做更多的工作,这不是很有用:一旦你压缩合并(并且已经提交),你通常应该认为你的分支“死”,并在你的squash-merge-commit {{ 1}}相当坚实。您可能希望保留一段时间,但是,如果S结果不好而您或您的组选择还原S:在这种情况下,您可以修复自己的分支,然后使用S的更新版本重新执行git merge --squash

1 通常情况下,Git会努力确保明显删除的提交至少持续一个月左右。但是,如果删除分支名称本身,分支的 reflog (这是保持提交的内容之一)也会消失。您现在依赖于yourbranch reflog。如果您在此存储库中检出了提交,那么这也将使提交保持一个月左右,但如果没有,则不会。

答案 1 :(得分:1)

  

如何将我的更改合并到主分支,但主分支显示一个提交?

这有些含糊不清。

普通合并确实添加了一个新的提交,但是新提交将所有来自“其他”分支的提交合并到“this”分支的历史记录中 - 它们都从此分支变为“可达” - 因此默认git log这样的命令输出显示了所有这些提交,正如您所观察到的那样。

如果唯一的要求是看到历史记录没有看到来自“其他”分支的个别提交,最简单的解决方案就是说

git log --first-parent

这允许您压缩历史视图而不实际丢弃任何信息。如果您希望获得关于分支如何演变的更精细的历史记录(例如追踪错误),那么它可能会很有用。它还确保如果你在“其他”分支上做更多的工作,你仍然可以合并这些额外的更改,而不会有太多不必要的麻烦。

特别是,如果“其他”分支已与其他开发人员共享,则保留的信息可能特别重要 - 如果您曾push编辑“其他”分支,这是最常见的假设。

但有时单个提交从历史角度来看完全没用,目的是完全丢弃它们(以及包含它们的分支)。例如,您可以定期提交,无论您的代码处于什么状态,插入和删除调试代码,存储不构建和通过测试的状态等等。有可能会使用这样的工作流程,以及在这种情况下,一个壁球合并(或一个互动的篮板,你可以压缩个别提交)可能需要产生一个“干净”的历史。

您可以尝试“拥有自己的蛋糕并将其吃掉”,但使用--squash合并创建简化的历史记录,同时仍保留原始分支以获得细粒度的历史记录。但是在这种情况下,git将失去对历史之间关系的追踪,这很容易导致比它的价值更多的麻烦。

最终,它取决于您(以及您的团队,如果适用)的工作流程。只是要知道你正在做什么和为什么,因为从表面上看,你可能会要求大锤解决一分钱问题,如果是这样你应该知道抵押品损坏。