Mon*_*nir 4 git version-control merge rebase
说我创建了一个新的功能分支,并对该功能分支进行了一系列提交。我的同事也做出了一些贡献,因此成为了master分支。如何将更改合并到master分支上,但master分支仅显示一次提交?我尝试合并,所有提交都显示出来,这表明我已分支。我已经尝试过重新基准化,这并没有显示我正在分支,但是仍然显示我的所有提交。在此先感谢您的帮助。
使用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
引用日志。如果您已在该存储库中检出了提交,那么提交也将保留一个月左右,但如果没有,则不会。