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

Mon*_*nir 4 git version-control merge rebase

说我创建了一个新的功能分支,并对该功能分支进行了一系列提交。我的同事也做出了一些贡献,因此成为了master分支。如何将更改合并到master分支上,但master分支仅显示一次提交?我尝试合并,所有提交都显示出来,这表明我已分支。我已经尝试过重新基准化,这并没有显示我正在分支,但是仍然显示我的所有提交。在此先感谢您的帮助。

tor*_*rek 6

使用git merge --squash(强制您git commit以后也要使用)。

描述

在Git中,提交就是历史。您不能不添加历史就添加提交,因为它们是同一回事。然后,您想要做的是一个不是合并提交的单一提交,它会产生与您进行实际合并提交相同的结果

有多种方法可以执行此操作,但最简单的方法是使用git merge --squash。该命令执行我所谓的“动词部分”,以进行合并(以执行合并的动作),但是与其进行合并commit(这是典型的形容词或名词部分)git merge,而是进行普通的非合并提交。

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

...--o--o--o   <-- mainline
      \
       o--o--o   <-- yourbranch
Run Code Online (Sandbox Code Playgroud)

如果您使用进行普通的日常合并git checkout mainline; git merge yourbranch,结果将是:

...--o--o--o---M   <-- mainline
      \       /
       o--o--o   <-- yourbranch
Run Code Online (Sandbox Code Playgroud)

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

git merge --squash但是,如果使用,则会得到以下结果:

...--o--o--o---S   <-- mainline
      \
       o--o--o   <-- yourbranch
Run Code Online (Sandbox Code Playgroud)

内容与新的相关承诺S完全一样的,你会通过使承诺得到内容M,但新的承诺S只有一个单亲家庭,所以也没有你的三个提交关联到主线分支。您现在可以将来删除自己的分支。当您执行此操作时,您的三个提交将变得无法找到,并且相对较早地,Git实际上将其完全删除。1个

请注意,您的分支不会自行消失yourbranch这里的名称使原始的三个提交保持活动状态。但是,如果您在分支机构上做更多的工作,那不是很有用:壁球合并(并提交)后,通常应将分支视为“死”,并S在合理地进行壁球合并提交后将其删除。固体。不过,您可能需要保留一段时间,以防万一情况S很糟,并且您或您的小组选择还原S:在这种情况下,您可以修复自己的分支,然后git merge --squash使用的更新版本yourbranch


1通常,Git会尽力确保明显删除的提交至少停留一个月左右。但是,如果删除分支名称本身,则分支的reflog(使提交保持不变的事物之一)也将消失。您现在依靠您的HEAD引用日志。如果您已在该存储库中检出了提交,那么提交也将保留一个月左右,但如果没有,则不会。