首页 文章

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

提问于
浏览
286

我是git的新手,我正在努力理解壁球和篮板之间的区别 . 根据我的理解,你做一个篮板时做一个壁球 .

3 回答

  • 300

    git merge --squashgit rebase --interactive 都可以生成"squashed"提交 .
    但它们有不同的用途 .

    将在目标分支上生成压缩提交,而不标记任何合并关系 .
    (注意:它不会立即生成提交:您需要额外的 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 分支 .

    在新的基础上重放部分或全部提交,允许你压缩(或者最近"fix up",看到这个SO question),直接进入:

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

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

    所以差异是:

    • merge 不会触及您的源分支(此处为 tmp ),并在您需要的位置创建一个提交 .

    • rebase 允许您使用 go on on the same source branch (仍为 tmp ):

    • 一个新基地

    • 更清洁的历史

  • 70

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

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

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

    enter image description here

    更多关于here

  • 76

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

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

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

    希望很清楚!

相关问题