zoukankan      html  css  js  c++  java
  • Git的fast forward和no fast forward和 three way merge 以及squash(聚合)

    github上上传了版本库https://github.com/ChuckGitMerge   包括merge和rebase

    没时间画图,貌似也不太会用画图工具,先写了一个文字版本的

    更新:2015年08月11日,使用了git for windows自带的git gui作为图片说明

    动画效果

    https://devblogs.microsoft.com/devops/pull-requests-with-rebase/

    一、Fast Forward,No Fast Forward 和 Squash的对比

    1.fast forward

    假设从master分支有三个节点C1,C2,C3

    从C3切出develop分支,并在develop分支上开发了C4,C5

    现在切回master分支,将develop分支合并到master。默认使用fast forward,master分支会直接指向C5。master分支的节点为C1,C2,C3,C4,C5

      

    develop分支和master分支,看起来是完全一样的

    2.no fast forward

    假设从master分支有三个节点C1,C2,C3

    从C3切出develop分支,并在develop分支上开发了C4,C5

    现在切回master分支,将develop分支合并到master。如果使用no  fast forward,在master分支上会生成一个新的commit为C6。master分支的节点为C1,C2,C3,C4,C5,C6

    3.squash(第一种)    

     第一种squash,develop分支切出之后,master分支没有新的提交

    假设从master分支有三个节点C1,C2,C3

    从C3切出develop分支,并在develop分支上开发了C4,C5

    下面的图的情况和fast forward以及no fast forward处理之前是一样的

    现在切回master分支,将develop分支合并到master。

    如果使用聚合的方式进行合并的话,那么git会将develop分支上所有的commit压缩成一个新的commit为C6直接合并到master分支。

    最后master分支上的节点为C1,C2,C3,C6

    从版本库的分支历史记录,是无法看出develop合并到master分支上的记录的。这是squash和其他合并方式的最主要的区别。

    并且master和develop还保持着相互独立

    二、Three Way Merge和Squash的对比

    1.three way merge

    假设从master分支有三个节点C1,C2,C3

    从C3切出develop分支,并在develop分支上开发了C4,C5

    master分支在C3的基础上开发了C6,C7这样进行合并的话,是无法fast forward的。

    合并方式:1.找到master分支的最新节点C7   

                  2.找到develop分支的最新节点C5

                  3.找到master分支和develop分支的共同祖先节点C3

                  4.对C3,C5,C7进行三方合并,最后生成新的commitC8

     

    2.squash(第二种)

    第二种squash,develop分支切出之后,master分支也有了新的提交

    假设从master分支有三个节点C1,C2,C3

    从C3切出develop分支,并在develop分支上开发了C4,C5

    master分支在C3的基础上开发了C6,C7这样进行合并的话

    下面的图的情况和three way merge处理之前是一样的

    合并方式,直接把develop上的2个结点的变化提取出来,然后直接应用在master分支上。

    从版本库的分支历史记录,是无法看出develop合并到master分支上的记录的。这是squash和其他合并方式的最主要的区别。

    并且master和develop还保持着相互独立

    参考资料

    http://www.open-open.com/lib/view/open1328069889514.html  git详解之三 git分支

    http://ariya.ofilabs.com/2013/09/fast-forward-git-merge.html   Fast-Forward Git Merge

    http://stackoverflow.com/questions/2850369/why-does-git-fast-forward-merges-by-default

  • 相关阅读:
    问题 D: 错误探测
    问题 C: 计算矩阵边缘元素之和
    同行列对角线的格子
    矩形交换行
    问题 R: 鸡尾酒疗法
    问题 : 字符串p型编码
    循环结构 整数的个数
    字符串c++字符环
    ISBN码字符串c++
    Uva
  • 原文地址:https://www.cnblogs.com/chucklu/p/4143714.html
Copyright © 2011-2022 走看看