在git中,merge --squash和rebase之间有什么区别?

时间:2010-03-11 17:33:19

标签: git merge rebase git-rebase squash

我是git的新手,我正在努力了解壁球和篮板之间的区别。根据我的理解,你在做一次变装时会进行压制。

4 个答案:

答案 0 :(得分:319)

git merge --squashgit rebase --interactive都可以产生“压扁”提交 但它们有不同的用途。

将在目标分支上生成压缩提交,而不标记任何合并关系 (注意:它不会立即产生提交:您需要额外的git commit -m "squash branch"
如果您想完全丢弃源分支(从SO question获取的模式),这非常有用:

 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分支。

在新基础上重播您的部分或全部提交,允许您压缩(或最近“修复”,请参阅此SO question),直接转到:

git checkout tmp
git rebase -i stable

      stable
      X-------------------G tmp
     /                     
a---b

如果您选择压缩tmp的所有提交(但是,与merge --squash相反,您可以选择重播一些,并压缩其他人)。

所以差异是:

  • merge未触及您的源分支(此处为tmp),并在您想要的位置创建一个提交。
  • rebase允许您继续使用相同的源分支(仍为tmp):
    • 新基地
    • 清洁历史

答案 1 :(得分:111)

合并提交:保留分支中的所有提交,并将它们与基础分支enter image description here上的提交交错

Merge Squash:保留更改但省略历史记录中的各个提交 enter image description here

Rebase:这会将整个功能分支从主分支的尖端开始,有效地将所有新提交合并到主分区

enter image description here

更多关于here

答案 2 :(得分:73)

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

重新定位是重新基础,即为树选择新的基础(父提交)。也许这个多变的术语更清楚:他们称之为移植,因为它只是:为一棵树选择一个新的基础(父提交,根)。

在进行交互式rebase时,您可以选择压缩,选择,编辑或跳过要进行rebase的提交。

希望很清楚!

答案 3 :(得分:9)

让我们从以下示例开始:

enter image description here

现在,我们有3个选项将功能分支的更改合并到主分支

  1. 合并提交
    将保留功能分支的所有提交历史并将其移至主分支
    将添加额外的虚拟提交。

  2. 变基并合并
    功能分支的所有提交历史记录附加在主分支
    的前面 不会添加额外的虚拟提交。

  3. 压缩并合并
    将所有功能分支提交分组为一个提交,然后将其附加到主分支
    的前面 将添加额外的虚拟提交。

您可以在下面找到 master分支的管理方式。

enter image description here

在所有情况下:
我们可以安全地删除功能分支