在git中,合并–squash和rebase有什么区别?

我是新来的混帐,我想了解一个壁球和rebase之间的区别。 据我了解,你做一个壁球时,做一个rebase。

这两个git merge --squashgit rebase --interactive git merge --squash可以产生一个“压扁”的承诺。
但他们服务于不同的目的。

  • git merge --squash abranch

将在目标分支上产生压扁的提交,而不标记任何合并关系。
(注意:它不会立即产生提交:你需要额外的git commit -m "squash branch"
如果你想完全抛弃源代码分支,从(从SO问题中提取的模式):

  git checkout stable X stable / a---b---c---d---e---f---g tmp 

至:

 git merge --squash tmp git commit -m "squash tmp" X-------------------G stable / a---b---c---d---e---f---g tmp 

然后删除tmp分支。

  • git rebase --interactive

在一个新的基础上重放你的一些或全部提交,允许你压扁(或者最近的“修复”,看到这个问题 ),直接进入:

 git checkout tmp git rebase -i stable stable X-------------------G tmp / a---b 

如果你selectmerge --squash tmp所有提交(但是,与merge --squash相反,你可以select重播一些, merge --squash其他)。

所以区别是:

  • merge不会触及你的源代码分支(这里是tmp ),并在你想要的地方创build一个提交。
  • rebase允许你继续在同一个源分支 (仍tmp ):
    • 一个新的基地
    • 更清洁的历史

合并压缩将一棵树(一系列的提交)合并为一个提交。 也就是说,它压缩n次提交中所做的所有更改。

重定基础是重新基础的,也就是为树select一个新的基础(父提交)。 也许这个更清晰的术语更清楚:他们称之为移植,因为它只是:为树select一个新的基础(父提交,根)。

在进行交互式重新分配时,您可以select压扁,select,编辑或跳过您要分配的提交。

希望是明确的!

合并提交:保留分支中的所有提交,并在基本分支上提交它们 在这里输入图像描述

合并壁球:保留变化,但省略历史的个人承诺 在这里输入图像描述

Rebase:这将整个特性分支移动到主分支的顶端,有效地将所有新的提交合并到主分支中

在这里输入图像描述

更多关于这里