代码之家  ›  专栏  ›  技术社区  ›  Monir

无任何提交历史记录的Git合并功能分支

  •  7
  • Monir  · 技术社区  · 6 年前

    假设我创建了一个新的功能分支,并对该功能分支进行了大量的提交。我的同事也做出了一些承诺,所以主分支。如何将更改合并到主分支上,但主分支只显示一次提交?我尝试过合并,所有提交都出现了,这表明我进行了分支。我尝试了重定基址,这并没有显示出我的分支,但仍然显示出我的所有提交。提前感谢您的帮助。

    2 回复  |  直到 6 年前
        1
  •  10
  •   torek    6 年前

    使用 git merge --squash (这迫使您也使用 git commit 之后)。

    描述

    历史。如果不添加历史记录,则无法添加提交,因为它们是相同的。那么,你想要的是 仅有一个的 提交,即 合并提交 生成与实际合并提交相同的结果

    有多种方法可以做到这一点,但最简单的方法是 git合并--挤压 。此命令执行我所称的“动词部分”, 要合并 执行Merging的动作,而不是 合并提交 ,这是一个典型的 git merge ,它进行普通的非合并提交。

    跳过 最终提交,强制您自己执行,使用 git提交 。最后的提交是一个普通的非合并提交,您必须这样做。如果我们按照我喜欢的方式绘制提交,我们将从以下内容开始:

    ...--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合并--挤压 然而,我们得到的却是:

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

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

    请注意,您的分支 不会自行消失 yourbranch 这将使您原来的三次提交保持有效。然而,如果您在分支上做更多的工作,这并不是很有用:一旦挤压合并(并提交),您通常应该认为您的分支“死”,并在挤压合并提交后将其删除 s 是相当可靠的。不过,您可能想保留一段时间,以防万一 s s :在这种情况下,您可以修复自己的分支,然后重新执行 git合并--挤压 稍后,使用的更新版本 您的分支机构


    1. 通常,Git会努力确保明显删除的提交至少保留一个月左右。但是,如果删除分支名称本身,则分支的 重新记录 ,这是保持承诺的因素之一,也会消失。您现在可以依靠 HEAD 重新记录。如果您在该存储库中签出了提交,那么提交也会保留一个月左右,如果没有,则不会保留。

        2
  •  1
  •   Mark Adelsberger    6 年前

    如何将更改合并到主分支上,但主分支只显示一次提交?

    这有点模棱两可。

    正常的合并确实会添加一个新的提交,但新的提交会将来自“其他”分支的所有提交合并到“此”分支的历史记录中—它们都可以从此分支“访问”—因此 违约 命令的输出,如 git log 如您所观察到的,显示所有这些提交。

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

    git log --first-parent
    

    这允许您压缩历史视图,而不会实际丢弃任何信息。如果在将来的某个情况下,您需要更细粒度的分支演化历史,例如跟踪一个bug,那么它可能会很有用。它还可以确保,如果您在“other”分支上做更多的工作,您仍然能够合并这些额外的更改,而不会带来很多不必要的麻烦。

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

    但有时,从历史的角度来看,个人犯下的罪行是完全无用的,其目的是完全抛弃这些罪行(以及构成这些罪行的分支)。例如,无论代码处于何种状态,您都可以定期提交,在执行过程中插入和删除调试代码,存储未生成和通过测试的状态,等等。可能会使用这样的工作流,在这种情况下,可能需要挤压合并(或挤压单个提交的交互式回退)来生成“干净”的历史记录。

    你可以试着“吃你的蛋糕,把它吃下去”,但使用 --squash 合并以创建简化的历史,同时仍保留原始分支以获得细粒度的历史。但在这种情况下,git将无法跟踪历史之间的关系,这很容易导致远远超出其价值的麻烦。

    最终,这取决于您(和您的团队,如果适用)确定的工作流。只要知道你在做什么 为什么? ,因为表面上看,你可能是在要求一个大锤式的解决方案来解决一个便士钉问题,如果是这样,你应该意识到附带的损害。